直接上代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = { 6, 1, 1, 2, 2, 2, 9, 9, 8, 3 ,3};
vector<int>::iterator it, it1;
cout << "Vec data: " << endl;
for (it = vec.begin(); it < vec.end(); it++)
cout << *it;
cout << endl;
for (it = ++vec.begin(); it != vec.end();)
{
it1 = find(vec.begin(), it, *it);
if (it1 != it)
{
it = vec.erase(it);
}
else
{
it++;
}
}
cout << "After delete redundant data: " << endl;
for (it = vec.begin(); it < vec.end(); it++)
cout << *it;
cout << endl;
}
其原理是,从vector的第二个数据开始,如果从vector起始找到相同的数据,则把自身删除。
这样一直循环到vector的最后一个数据。
注意:调用erase后,原来的iterator就失效了,会变成野指针。因此必须重新给iterator赋值。
it = vec.erase(it); 这行代码返回的就是新的iterator,并且指向被删除的数据后面那个数据。
比如下面的代码会导致程序崩溃:
// settest.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = { 6, 1, 1, 2, 2, 2, 9, 9, 8, 3 ,3};
vector<int>::iterator it, it1;
cout << "Vec data: " << endl;
for (it = vec.begin(); it < vec.end(); it++)
cout << *it;
cout << endl;
for (it = ++vec.begin(); it != vec.end(); it++)
{
it1 = find(vec.begin(), it, *it);
if (it1 != it)
{
it = vec.erase(it);
}
}
cout << "After delete redundant data: " << endl;
for (it = vec.begin(); it < vec.end(); it++)
cout << *it;
cout << endl;
}