作用

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的使用的更多相关文章

  1. STL中一些函数的应用

    1.nth_element():找到第几大的数.用法:nth_element(a,a+k,a+n),返回一个数组a中第k大的数,时间复杂度比较小,头文件#include <algorithm&g ...

  2. STL 去重 unique

    一.unique函数 类属性算法unique的作用是从输入序列中"删除"所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度 ...

  3. C++STL中的unique函数解析

    一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即”删除”序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情 ...

  4. STL中的unique()和lower_bound ,upper_bound

    unique(): 作用:unique()的作用是去掉容器中相邻元素的重复元素(数组可以是无序的,比如数组可以不是按从小到大或者从大到小的排列方式) 使用方法:unique(初始地址,末地址): 这里 ...

  5. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

  6. STL中的所有算法(70个)

    STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...

  7. stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结

    stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结 1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:voi ...

  8. 【转】STL中vector、list、deque和map的区别

    1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...

  9. STL中的algorithm

    STL中的algorithm #include<algorithm>中的泛函算法,需要添加头文件. 搜索算法:find() .search() .count() .find_if() .s ...

随机推荐

  1. UVALive3126 Taxi Cab Scheme —— 最小路径覆盖

    题目链接:https://vjudge.net/problem/UVALive-3126 题解: 最小路径覆盖:即在图中找出尽量少的路径,使得每个结点恰好只存在于一条路径上.其中单独一个点也可以是一条 ...

  2. centOS安装mysql---glibc方式

    写在前面: 首先,centos是自己集成mysql的.但是我要用的服务器人家没给装. 其次,centos是可以yum安装mysql的,我很高兴而且轻松的用yum把mysql安装上了.但是,运行的时候很 ...

  3. Linux 杀死所有进程

    方法一: sudo killall -9 netease-cloud-music 这种方法,必须要写全称. sudo netease-cloud-music QStandardPaths: XDG_R ...

  4. 使用Kotlin如何startActivity

    没错,就是这么简单的一个功能,不过由于初学kotlin,所以找了很久才找到如何写,所以还是贴出来给需要的人吧,上代码: startActivity(Intent(MainActivity@this, ...

  5. Java抽象类和接口的区别(好长时间没看这种文章了)

    Java抽象类和接口的区别(好长时间没看这种文章了) abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的 ...

  6. python库学习笔记——BeautifulSoup处理子标签、后代标签、兄弟标签和父标签

    首先,我们来看一个简单的网页https://www.pythonscraping.com/pages/page3.html,打开后: 右键"检查"(谷歌浏览器)查看元素: 用导航树 ...

  7. Python 函数定义以及参数传递

    Python 函数定义以及参数传递1.函数定义#形如def func(args...): doSomething123以关键字def 开头,后面是函数名和参数下面是函数处理过程. 举例: def ad ...

  8. bzoj3195 [Jxoi2012]奇怪的道路——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3195 看到数据范围就应该想到状压呢... 题解(原来是这样):https://www.cnb ...

  9. os.path.dirname(__file__)和os.path.abspath(__file__)区别

  10. 3.jeesite主从表开发

    1. 2 3. 4. 5. 6. 7. 8. 9. 10.