STL中的unique和unique_copy函数

1、unique函数

这个函数的功能就是删除相邻的重复元素,而后从新排列输入范围内的元素,并返回一个最后一个无重复值的迭代器(并不改变容器长度)。函数

例如:spa

 1     vector<int>q(10);
 2     for(int i = 0; i < 10; i++){
 3         q[i] = (i*i + i*i*i) % 5;
 4         cout << q[i] << " ";
 5     }
 6     cout << endl;
 7     sort(q.begin(),q.end());
 8     
 9     for(int i = 0; i < 10; i++)
10         cout << q[i] << " ";
11     cout << endl;
12     
13     int tot = unique(q.begin(),q.end()) - q.begin();
14     
15     for(int i = 0; i < 10; i++)
16         cout << q[i] << " ";
17     
18     cout << endl;
19     cout << tot << endl;

运行结果为code

unique返回的是迭代器,但咱们减去容器首位置就能够获得无重复的长度了。还有就是使用unique函数前得排序(或者保证容器是有序的),由于它往相邻位置查找有无重复,unique函数彻底等价于下面这个函数。blog

 1 iterator My_Unique (iterator first, iterator last){
 2   if (first==last) return last;
 3  
 4   iterator result = first;
 5   while (++first != last){
 6     if (!(*result == *first))  
 7       *(++result)=*first;
 8   }
 9   return ++result;
10 }

能够看的出unique的工做流程是吧不重复的元素往前移,并非把重复元素日后移动,还有就是记得使用unique必定要保证有序!排序

知道了unique函数就能够利用这个函数作不少事情了,好比和erase函数达到删除重复元素的目的等等。工作流

2、unique_copy

功能和unique同样,可是多了一个copy,函数有三个参数,首位置、末位置和另外一个容器,例如:it

 1     vector<int>q(10),vec;
 2     for(int i = 0; i < 10; i++){
 3         q[i] = (i*i + i*i*i) % 5;
 4         cout << q[i] << " ";
 5     }
 6     cout << endl;
 7     sort(q.begin(),q.end());
 8 
 9     for(int i = 0; i < 10; i++)
10         cout << q[i] << " ";
11     cout << endl;
12 
13     unique_copy(q.begin(),q.end(),back_inserter(vec));
14 
15     for(int i = 0; i < 10; i++)
16         cout << q[i] << " ";
17     cout << endl;
18 
19     for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++){
20         cout << *it << " ";
21     }
22     cout << endl;

运行结果为ast

能够发现,函数操做是拷贝到另外一个容器中了,并不改变当前容器的元素顺序。class

值得一提的就是unique_copy没有返回值,不能直接得出有几个不重复元素。容器

相关文章
相关标签/搜索