STL中unique的使用
作用
unique函数可以删除有序数组中的重复元素,即去重(并不是真正的删除,后面会讲)
定义在头文件<algorithm>中
函数原型
1.只有两个参数,且参数类型都是迭代器:
iterator unique(iterator first,iterator last);
这是最常用的形式,表示对区间[first,second)去重
2.有三个参数,且前两个参数类型为迭代器,最后一个参数类型可以看作是bool类型:
iterator unique(iterator first,iterator last,pred);
与两个参数的主要区别是在第三个参数,其为自定义的“元素相等”函数,返回值为bool类型,根据这个函数定义的元素相等规则来去重
其行为等价于这个函数
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last)
{
if (first==last) return last; ForwardIterator result = first;
while (++first != last)
{
if (!(*result == *first)) // or: if (!pred(*result,*first)) for version (2)
*(++result)=*first;
}
return ++result;
}
从这个函数定义可以看出,首先要满足原数组有序,不是有序可能会出错,其次,去重的结果是非重复元素部分+原数组的后部分(与网上很多说讲相同分布移到数组后面还是有点不同)
演示
注意:unique有返回值,返回指向非重复部分的最后元素的下一个元素的迭代器,所以利用它可以删除多余部分,也可以求剩余部分的个数。(代码里有写)。
//vector版
#include<cstdio>
#include<algorithm> //std::unique
#include<vector>
using namespace std; const int maxn = + ;
int arr[maxn]; int main()
{
int n;
while (scanf("%d",&n) == && n)
{
for (int i = ; i < n; ++i) scanf("%d", &arr[i]);
sort(arr, arr + n); vector<int>v(arr, arr + n);
vector<int>::iterator it = unique(v.begin(), v.end()); v.erase(it, v.end()); //这里就是把后面多出来的元素删除 [first,second) for (it = v.begin(); it != v.end(); it++)
printf("%d ", *it);
printf("\n");
}
return ;
}
//直接用数组
#include<cstdio>
#include<algorithm> //std::unique
#include<vector>
using namespace std; const int maxn = + ;
int arr[maxn]; int main()
{
int n;
while (scanf("%d", &n) == && n)
{
for (int i = ; i < n; ++i) scanf("%d", &arr[i]);
sort(arr, arr + n);
int k = unique(arr, arr + n) - arr; for (int i = ; i < k; i++)
printf("%d ", arr[i]);
printf("\n");
}
return ;
}
参考链接:
1、https://blog.csdn.net/tomorrowtodie/article/details/51907471
2、https://www.cnblogs.com/wangkundentisy/p/9033782.html
3、http://www.cplusplus.com/reference/algorithm/unique/?kw=unique
STL中unique的使用的更多相关文章
- STL中一些函数的应用
1.nth_element():找到第几大的数.用法:nth_element(a,a+k,a+n),返回一个数组a中第k大的数,时间复杂度比较小,头文件#include <algorithm&g ...
- STL 去重 unique
一.unique函数 类属性算法unique的作用是从输入序列中"删除"所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度 ...
- C++STL中的unique函数解析
一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即”删除”序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情 ...
- STL中的unique()和lower_bound ,upper_bound
unique(): 作用:unique()的作用是去掉容器中相邻元素的重复元素(数组可以是无序的,比如数组可以不是按从小到大或者从大到小的排列方式) 使用方法:unique(初始地址,末地址): 这里 ...
- STL中map与hash_map容器的选择收藏
这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...
- STL中的所有算法(70个)
STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...
- stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结
stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结 1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:voi ...
- 【转】STL中vector、list、deque和map的区别
1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...
- STL中的algorithm
STL中的algorithm #include<algorithm>中的泛函算法,需要添加头文件. 搜索算法:find() .search() .count() .find_if() .s ...
随机推荐
- Powershell 常见问题
unapproved verbs WARNING: The names of some imported commands from the module 'todo' include unappro ...
- HEOI2016 树
传送门 这道题还是很简单的,可以树剖,然后还有看大佬暴力模拟AC的????!! 我们就执行俩操作,一个是单点修改,这个随便修,然后就是查询一个点,离他最近的被打过标记过的祖先.这个可以这么想,我们先q ...
- Goland软件使用教程(二)
Goland软件使用教程(二)一.编码辅助功能 1. 智能补全 IDE通过自动补全语句来帮助您来编写代码.快捷键“Ctrl+shift+空格”将会给你一个在当前上下文中最相关符号的列表,当您 ...
- Python3列表、元组、字典、集合的方法
一.列表 温馨提示:对图片点右键——在新标签页中打开图片: 1.count() 定义:统计指定元素在列表中出现的次数并返回这个数.若指定的元素不存在则返回:0. 格式:[列表].count(“指定元素 ...
- Navicat: Can't create a procedure from within another stored routine
测试调用mysql的存储过程,于是用Navicat写,结果报这个错误,源代码如下: CREATE PROCEDUREQueryDate() BEGIN SELECTCURDATE(); E ...
- webpack -v显示的版本与package.json的devDependencies节点显示的webpack版本不一致的问题
最近在学习webpack,遇到个奇葩的问题.就是安装完成webpack后,查看安装的webpack版本与package.json中显示的版本不一致, webpack是局部安装的,非全局安装, 命令1: ...
- E20170520-ts
regexp n. 正则表达式 metacharacter メタ文字 元字符 quote vt. 引述,引用; escape v. 逃脱; 逃离; n. 逃走; 逃跑工具或方法; reg ...
- markdown(语法)入门学习:
原文链接:https://segmentfault.com/a/1190000010223222#articleHeader9 1.标题 注:#后面保持空格 # h1 ## h2 ### h3 ### ...
- bzoj 3437: 小P的牧场【斜率优化】
emmm妹想到要倒着推 先假设只在n建一个控制站,这样的费用是\( \sum_{i=1}^{n} b[i]*(n-i) \)的 然后设f[i]为在i到n键控制站,并且i一定建一个,能最多节省下的费用, ...
- (DP ST表 线段树)51NOD 1174 区间中最大的数
给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...