作用
unique函数可以删除有序数组中的重复元素,即去重(并不是真正的删除,后面会讲)
定义在头文件<algorithm>中
函数原型
1.只有两个参数,且参数类型都是迭代器:
iterator unique(iterator first,iterator last);
这是最常用的形式,表示对区间[first,second)去重
2.有三个参数,且前两个参数类型为迭代器,最后一个参数类型可以看作是bool类型:
iterator unique(iterator first,iterator last,pred);
与两个参数的主要区别是在第三个参数,其为自定义的“元素相等”函数,返回值为bool类型,根据这个函数定义的元素相等规则来去重
其行为等价于这个函数
1 template <class ForwardIterator>
2 ForwardIterator unique (ForwardIterator first, ForwardIterator last)
3 {
4 if (first==last) return last;
5
6 ForwardIterator result = first;
7 while (++first != last)
8 {
9 if (!(*result == *first)) // or: if (!pred(*result,*first)) for version (2)
10 *(++result)=*first;
11 }
12 return ++result;
13 }
从这个函数定义可以看出,首先要满足原数组有序,不是有序可能会出错,其次,去重的结果是非重复元素部分+原数组的后部分(与网上很多说讲相同分布移到数组后面还是有点不同)
演示
注意:unique有返回值,返回指向非重复部分的最后元素的下一个元素的迭代器,所以利用它可以删除多余部分,也可以求剩余部分的个数。(代码里有写)。
//vector版
1 #include<cstdio>
2 #include<algorithm> //std::unique
3 #include<vector>
4 using namespace std;
5
6 const int maxn = 100000 + 10;
7 int arr[maxn];
8
9 int main()
10 {
11 int n;
12 while (scanf("%d",&n) == 1 && n)
13 {
14 for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
15 sort(arr, arr + n);
16
17 vector<int>v(arr, arr + n);
18 vector<int>::iterator it = unique(v.begin(), v.end());
19
20 v.erase(it, v.end()); //这里就是把后面多出来的元素删除 [first,second)
21
22 for (it = v.begin(); it != v.end(); it++)
23 printf("%d ", *it);
24 printf("
");
25 }
26 return 0;
27 }
//直接用数组
1 #include<cstdio>
2 #include<algorithm> //std::unique
3 #include<vector>
4 using namespace std;
5
6 const int maxn = 100000 + 10;
7 int arr[maxn];
8
9 int main()
10 {
11 int n;
12 while (scanf("%d", &n) == 1 && n)
13 {
14 for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
15 sort(arr, arr + n);
16 int k = unique(arr, arr + n) - arr;
17
18 for (int i = 0; i < k; i++)
19 printf("%d ", arr[i]);
20 printf("
");
21 }
22 return 0;
23 }
参考链接:
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