宏观来看,使用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;