通常,remove()和erase()联合使用:remove的返回值作为erase()的第一个参数。
vector<int> veci;
veci.push_back(1);
veci.push_back(2);
veci.push_back(3);
veci.push_back(4);
veci.push_back(5);
veci.push_back(3);
veci.push_back(2);
veci.push_back(3);
veci.erase(remove(vec.begin(), vec.end(), 3),vec.end()); //这样把veci中的3删除
//cout<<veci.size(); 输出5
erase(): 删除指定位置的元素后,返回值是一个迭代器,指向删除元素下一个元素!
有两种形式:删除指定位置的元素:erase(iterator position);
删除某一段的元素:erase(iterator first, iterator last);
法1:
for(vector<int>::iterator iter=veci.begin();iter!=veci.end(); iter++)
{
if( *iter == 3)
veci.erase(iter);//veci.erase(it)之后,iter变成一个野指针,不能进行++。
}
修改:
for(vector<int>::iterator iter=veci.begin();iter!=veci.end();)
{
if( *iter == 3)
{
iter0=iter;
veci.erase(iter0);
//cout<<*iter; 输出4 //在执行完删除后,iter此时指向下一个元素
}
iter++;
}
这段代码也是错误的:
1)无法删除两个连续的"3"; (iter0在erase()之后失效)
2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)
为了能够删除连续的3,使用remove函数:STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。
如:
vector<int> vec = {1,1,2,3,4,5,6,7,8,9}
remove(vec.begin(), vec.end(), 1);
结果如下
vec = {2,3,4,5,6,7,8,9,1,1};
修改:
vec.erase(remove(vec.begin(), vec.end(), 1),vec.end());
结果:
vec.erase(remove(vec.begin(), vec.end(), 1),vec.end());