vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式:
iterator erase(iterator _Where);
iterator
如果是删除指定位置的元素时:返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
#include <vector>
#include <iostream>
int main()
{
using namespace std;
vector <int> v1;
vector <int>::iterator Iter;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
cout << "v1 =";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << " " << *Iter;
cout << endl;
v1.erase(v1.begin());
cout << "v1 =";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << " " << *Iter;
cout << endl;
v1.erase(v1.begin() + 1, v1.begin() + 3);
cout << "v1 =";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << " " << *Iter;
cout << endl;
}
大家可以知道,需删除元素10只要指定该元素对应的迭代器传给erase就OK了;
那现在如果该容器中有两个元素10要怎么删除呢?
接着我做下修改,向容器中添加一新的元素10
- v1.push_back( 10 );
大多数初学者在不熟知erase的原理的时候,也会像我一样这样处理,
一一遍历容器找到元素值为10,然后一一删除
#include <vector>
#include <iostream>
int main()
{
using namespace std;
vector <int> v1;
vector <int>::iterator Iter;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
v1.push_back(10);
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
{
if (*Iter == 10)
{
v1.erase(Iter);
}
}
cout << "v1 =";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << " " << *Iter;
cout << endl;
}
程序编译错误,出现这种错误是没搞懂erase的原理,当调用erase()后Iter迭代器就失效了,变成了一野指针。
所以要处理这种问题,关键是要解决调用erase()方法后,Iter迭代器变成野指针的问题,可以给他赋一个新的迭代器。
#include <vector>
#include <iostream>
int main()
{
using namespace std;
vector <int> v1;
vector <int>::iterator Iter;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
v1.push_back(10);
for (Iter = v1.begin(); Iter != v1.end(); )
{
if (*Iter == 10)
{
Iter=v1.erase(Iter);
}
else
{
Iter++;
}
}
cout << "v1 =";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << " " << *Iter;
cout << endl;
}
另一种删除方法:借助remove函数
v1.erase(remove(v1.begin(),v1.end(),6),v1.end());
注:remove是个stl的通用算法std::remove(first,last,val)移除[first, last)范围内等于val的元素在vector里面用就类似于iter = std::remove(vec.begin(), vec.end(), val)但这个函数只是把val移到vec的末尾,并不真正删除真正删除,还要调用一次erase函数。
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
using namespace std;
vector <int> v1;
vector <int>::iterator Iter;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
v1.push_back(10);
v1.erase(remove(v1.begin(), v1.end(), 10),v1.end());
cout << "v1 =";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << " " << *Iter;
cout << endl;
}