一、unique函數
這個函數的功能就是删除相鄰的重複元素,然後重新排列輸入範圍内的元素,并傳回一個最後一個無重複值的疊代器(并不改變容器長度)。
例如:
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;
運作結果為
unique傳回的是疊代器,但我們減去容器首位置就可以得到無重複的長度了。還有就是使用unique函數前得排序(或者保證容器是有序的),因為它往相鄰位置查找有無重複,unique函數完全等價于下面這個函數。
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函數達到删除重複元素的目的等等。
二、unique_copy
功能和unique一樣,但是多了一個copy,函數有三個參數,首位置、末位置和另一個容器,例如:
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;
可以發現,函數操作是拷貝到另一個容器中了,并不改變目前容器的元素順序。
值得一提的就是unique_copy沒有傳回值,不能直接得出有幾個不重複元素。