STL中unique的使用

作用

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("\n");
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("\n");
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 

posted @ 2018-11-21 21:33  Rogn  阅读(545)  评论(0编辑  收藏  举报