1. 程式人生 > >深入理解並徹底掌握使用unique函式去重

深入理解並徹底掌握使用unique函式去重

巨集觀來看,使用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;