天天看點

STL中的unique和unique_copy函數

一、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;      

運作結果為

STL中的unique和unique_copy函數

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;      
STL中的unique和unique_copy函數

可以發現,函數操作是拷貝到另一個容器中了,并不改變目前容器的元素順序。

值得一提的就是unique_copy沒有傳回值,不能直接得出有幾個不重複元素。