深入理解並徹底掌握使用unique函式去重
阿新 • • 發佈:2018-12-17
巨集觀來看,使用unique函式去重主要分為以下幾步:
以vector為例:
宣告部分:
#include<vector>
#include<algorithm>
vector<int>v;
vector<int>::iterator new_end;
三個主要步驟:
sort(v.begin(),v.end());//第一步:排序(從小到大),從大到小也可以 new_end=unique(v.begin(),v.end());//第二步:呼叫unique函式,返回不重複元素的的結束位置 v.erase(new_end,v.end());//第三步:擦除從不重複元素的的結束位置到原陣列結束位置的元素
我們來深入再看:
unique函式幹了什麼:
舉個例子:一個vector裡放入了5,5,2,3,1,1這個序列:
根據我們的步驟:
sort: 1,1,2,3,5,5;
unique: 1,2,3,5,5,5;
怎麼回事呢?
不重複的元素前移了,返回的new_end是不重複元素的最後一個位置;
最後一步:erase:使v.size()從6變成了4,但是第5,6個位置的5,5兩個元素依然在。
請看測試程式碼:
#include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int>v; vector<int>::iterator new_end,it; int main(){ v.push_back(3); v.push_back(4); v.push_back(1); v.push_back(3); v.push_back(5); v.push_back(3); v.push_back(2); v.push_back(1); v.push_back(8); v.push_back(4); int n=v.size(); for(int i=0;i<v.size();i++){ cout<<v[i]<<" "; } cout<<endl; sort(v.begin(),v.end()); new_end=unique(v.begin(),v.end()); cout<<*new_end<<endl; for(int i=0;i<n;i++){ cout<<v[i]<<" "; } cout<<endl; v.erase(new_end,v.end()); for(int i=0;i<v.size();i++){ cout<<v[i]<<" "; } cout<<endl; for(int i=0;i<n;i++){ cout<<v[i]<<" "; } cout<<endl; return 0; }
執行結果:
再按照我們的流程:
序列 v.size()
給出 3 4 1 3 5 3 2 1 8 4 10;
sort 1 1 2 3 3 3 4 4 5 8 10;
unique 1 2 3 4 5 8 4 4 5 8 10;
erase 1 2 3 4 5 8 4 4 5 8 6;