stl algorithm -- sort ,unique
在寫私信群聊代碼的時候碰到怎么把一個vector<Int> 元素unique化的問題,基本上就是需要下面這么做,用<algorithm>中的,先sort再unique
1 #include <algorithm> 2 #include <iostream> 3 #include <vector> 4 #include <stdio.h> 5 using namespace std; 6 void print(vector<int>& vec); 7 int main(){ 8 int a[] = {1,3,4,4,6,3,2,5,6,2}; 9 vector<int> vec(a, a+10); 10 print(vec); 11 vector<int>::iterator it; 12 sort(vec.begin(), vec.end()); 13 print(vec); 14 it = unique(vec.begin(), vec.end()); 15 // printf("%p\n", &vec); 16 vec.resize(it-vec.begin()); 17 // printf("%p\n", &vec); 18 print(vec); 19 printf("%p\n", &vec); 20 vec.resize(23, 22); 21 printf("%p\n", &vec); 22 print(vec); 23 24 } 25 void print(vector<int>& vec){ 26 for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++){ 27 cout << *it << " "; 28 } 29 cout << endl; 30 }運行結果 :
1 3 4 4 6 3 2 5 6 2 
1 2 2 3 3 4 4 5 6 6 
1 2 3 4 5 6 
0x7fffa2daab30
0x7fffa2daab30
1 2 3 4 5 6 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 
?
注意20行的 resize, ?resize是sequence containers(vector, list, deque)共有的一個方法,它把vector擴展或縮小到參數(shù)指定的那么大,從20行可以看到它可以帶2個參數(shù),第二個指定如果擴展的話要復制過去的對象, 可以看到resize之后vector的地址是不變的,即使是擴大,注意19行輸出地址的方式, "%p"意味著要接一個void*型的參數(shù)
有些方法是某種container所特有的,比如list自己就有sort,它還自己定義了幾種算法,unique,merge,reverse,只有l(wèi)ist有,可能是它自身特性決定的吧,它自己來實現(xiàn)比一般性的algorithm來得好, vector所特有的是capacity, reserve? 參考http://www.cplusplus.com/reference/stl/
?
2 ?試著寫下上面unique的實現(xiàn)算法,sort的我沒有寫出來
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 using namespace std; 5 void print(vector<int>& vec); 6 template <class InputIterator> 7 InputIterator unique_wy(InputIterator begin, InputIterator end){typename iterator_traits<InputIterator>::value_type value = *begin;
cout << "in unique wy *begin = " << value << endl; 8 InputIterator last = begin; 9 while(++begin != end){ 10 if (*last != *begin){ 11 *++last = *begin; 12 } 13 } 14 return ++last; 15 } 16 int main(){ 17 int a[] = {1,1,2,2,4,6,7,7,4}; 18 vector<int> vec(a, a+9); 19 print(vec); 20 // sort_wy(vec.begin(), vec.end()); 21 // print(vec); 22 vector<int>::iterator it = unique_wy(vec.begin(), vec.end()); 23 vec.resize(it-vec.begin()); 24 print(vec); 25 return 0; 26 } 27 void print(vector<int>& vec){ 28 for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++){ 29 cout << *it << " "; 30 } 31 cout << endl; 32 }
運行結果:
1 1 2 2 4 6 7 7 4 
in unique_wy *begin = 1
1 2 4 6 7 4
本來我想把sort也寫上去,算法不過關,沒寫出來。 去<stl_algo.h>的源碼中看了點sort源碼,sort有一系列的實現(xiàn)及輔助函數(shù), 里面的參數(shù)都命名的是 RandomIterator.?? ? ?這里引出了<algorithm>中算法的實現(xiàn)了,<algorithm>中都是function template,這是針對未知的iterator實現(xiàn)的算法,只要傳進去的iterator滿足相應的要求, 注意上面7,8行之間的代碼,是如何使用iterator_traits<InputInterator>的,在<algorithm>中要使用iterator(通過模板參數(shù)傳進來的類型)相關的幾個type,都是這么用的
?
3 <iterator>
從上面的可以看出,自己定義的iterator若要被stl algorithm所使用,則必須按照iterator_traits中要求的定義那5個type, 當然也可以不自己定義,從 struct iterator{}派生,它會幫我們定義這些類型,<iterator>中還定義了5個空struct,有簡單的派生關系input_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag ??http://www.cplusplus.com/reference/std/iterator/?, 在從struct iterator{}派生的時候,必須給它傳兩個參數(shù), 指向的type,和這五個之一的 catagory type, ?從前述的那個文檔中我們可以看到5個iterator catogory必須要支持哪些operator, 即必須重載了哪些operator. 雖然下面的例子是從iterator<>派生來提供5個預定義的類型,但我看c++/4.6實現(xiàn)的源碼,stl_list.h中的 _List_iterator是直接在其中實現(xiàn)的,沒有從iterator<>派生
1 class WyList; 2 class WyListIterator: public iterator<random_access_iterator_tag, WYList> { 3 //一系列的operator overloading bool operator==(WY&, WY&); 4 // WyListIterator& operator++(){} ; 5 // WyListIterator operator++(int){} ; 6 //WyListIterator operator+(int n){}; 7 // typename iterator_traits::value_type operator[](int n) { }; 8 }以上寫得很簡單,本來想可以去模擬一下 std ?list的實現(xiàn), ?注意2行中從iterator派生時的用法,傳入的參數(shù),自己定義的WyListIterator是一個類,并不是模板,這也就是container的實現(xiàn)者自己來實現(xiàn)自己的iterator的表現(xiàn) 另外注意4,5行重載實現(xiàn) ++WyListIterator 和WyListIterator++時返回值的不同,體現(xiàn)了這前置和后置++的不同,一個對自己操作后返回自己,一個先copy自己,然后再把自己++,然后返回之前的自己
轉載于:https://www.cnblogs.com/livingintruth/archive/2012/06/11/2543418.html
總結
以上是生活随笔為你收集整理的stl algorithm -- sort ,unique的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: linux下练习 c++ 容器set、m
 - 下一篇: 大数据项目实施案例