头文件:#include
函数去重的原理类似于下面这个(来自 http://www.cplusplus.com/reference/algorithm/unique/):
从头到尾,判断当前元素是否等于上一个元素,将不重复的元素移到前面来(赋值操作),而不是将重复的元素移动到后面去。
PS:因为是判断当前元素是否等于上一个元素,所以要去重的容器必须是经过排序的有序容器。
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last)
{
if (first==last) return last;
ForwardIterator result = first;
while (++first != last)
{
if (!(*result == *first)) // or: if (!pred(*result,*first)) for version (2)
*(++result)=*first;
}
return ++result;
}
ForwardIterator unique(
ForwardIterator first,
ForwardIterator last
);
ForwardIterator unique(
ForwardIterator first,
ForwardIterator last,
BinaryPredicate pred
);
去重区间:[ fist, last )
输入值:有序容器
返回值:去重以后vector中没有重复元素的下一个位置的迭代器。
执行完unique():从容器的开始到返回的迭代器位置的元素是不重复的元素,而从返回的迭代器位置到vector.end()的元素都是没有意义的(这东西就是原来排序后的东西,没变过)。
//unique讲解示例
#include
#include
#include
using namespace std;
int main() {
vector<int> v{3,4,5,1,2,5,3};
//排序
sort(v.begin(), v.end());
//1 2 3 3 4 5 5
//pos是去重以后vector中没有重复元素的下一个位置的迭代器。
vector<int>::iterator pos = unique(v.begin(), v.end());
//去重后整个容器
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << ' ';
}
cout << endl;
//1 2 3 4 5 5 5
//从容器开始到pos:去重后的容器元素
for (vector<int>::iterator i = v.begin(); i < pos; i++)
{
cout << *i << ' ';
}
cout << endl;
//1 2 3 4 5
//从pos到容器结束:无意义的元素
for (vector<int>::iterator i = pos; i < v.end(); i++)
{
cout << *i << ' ';
}
cout << endl;
//5 5
return 0;
}
erase()擦除无意义的部分
//unique使用示例
#include
#include
#include
using namespace std;
int main() {
vector<int> v{3,4,5,1,2,5,3};
sort(v.begin(), v.end());
//1 2 3 3 4 5 5
vector<int>::iterator pos = unique(v.begin(), v.end());
v.erase(pos, v.end());
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << ' ';
}
cout << endl;
//1 2 3 4 5
return 0;
}
类似sort()函数自定义排序方式,使用的时候不写参数,直接myUnique
。
bool myUnique(int i, int j)
{
return i == j;
}
//unique自定义示例
#include
#include
#include
using namespace std;
bool myUnique(int i, int j)
{
return i == j;
}
int main() {
vector<int> v{3,4,5,1,2,5,3};
sort(v.begin(), v.end());
//1 2 3 3 4 5 5
vector<int>::iterator pos = unique(v.begin(), v.end(),myUnique);
v.erase(pos, v.end());
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << ' ';
}
cout << endl;
//1 2 3 4 5
return 0;
}
比如:
1,3,1,7,5,7
结果:
1,3,7,5
原理:就是简单比较当前元素是否出现在当前元素之前的数组中,如果没有才填入。
void print_readingOrder(vector<int> vec)
{
vector<int> vecprint;
//第一个元素不用比
vecprint.push_back(vec[0]);
for(int i = 1;i<vec.size();i++)
{
bool tag=true;
for(int j =0;j<i;j++)
{
if(vec[i]==vec[j])
{
tag=false;
break;
}
}
if(tag==true) vecprint.push_back(vec[i]);
}
//控制台输出
for(int i=0;i<vecprint.size();i++)
{
cout<<vecprint[i]<<endl;
}
}
参考:
https://www.cnblogs.com/cxq0017/p/6555533.html
https://www.cnblogs.com/aminxu/p/4686332.html
https://www.cnblogs.com/wangkundentisy/p/9033782.html