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沒有返回值,不能直接得出有幾個不重複元素。容器

相關文章
相關標籤/搜索