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 ...
随机推荐
- HTML表单常用标签
名称 用例 备注 文本输入框 <input type="text" name="uname" value="" ...
- leetcode 400 Add to List 400. Nth Digit
Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... Note:n is ...
- [IMX6DL][Android4.4] 电池低电量告警提示【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/51789964 之前版本的电池电量低是通过发送 intent ACTION_BATTERY_L ...
- YTU 2917: Shape系列-3
2917: Shape系列-3 时间限制: 1 Sec 内存限制: 128 MB 提交: 372 解决: 237 题目描述 送给小亮的Rectangle类已完成,送给小华Circle类还没有完成. ...
- [原创]java导出word的5种方式
在网上找了好多天将数据库中信息导出到word中的解决方案,现在将这几天的总结分享一下.总的来说,java导出word大致有5种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Ja ...
- SPOJ:NT Games(欧拉函数)
Katniss Everdeen after participating in Hunger Games now wants to participate in NT Games (Number Th ...
- CentOS 6.6实现永久修改DNS地址的方法
本文实例讲述了CentOS 6.6实现永久修改DNS地址的方法. 百牛信息技术bainiu.ltd整理发布于博客园 分享给大家供大家参考,具体如下:1.配置ip地址文件 /etc/sysconfig/ ...
- jenkins配置发送邮件时,日志中显示发送成功,但是邮箱没有收到邮件
遇到这种问题,是因为安装的Email Extension Plugin插件版本与jenkins不兼容, 经试验2.39.3版本可以正常发送邮件,在jenkins主目录中 将2.39.3的文件和文件夹复 ...
- bzoj 2809: [Apio2012]dispatching【dfs序+主席树】
可并堆就可以,但是想复健一下主席树. 考虑枚举管理者,然后选忍者的时候在子树中贪心的从小到大选.做成dfs序就是选区间内和小于等于k的最多点.可以用主席树,查询的时候在主席树上二分即可 这里注意,为了 ...
- NOIp 2010/Luogu P1525 关押罪犯 【二分图/并查集】 By cellur925
题目传送门 感想:相信自己的想法!继续挖掘! 读完题目后:看到的最大值最小?二分答案啊!再仔细一看:wi达到了1e9,二分可能费点劲.(其实真的是可以的)而且check函数貌似并没有什么行之有效的写法 ...