最近在编写传感器预处理的程序时,遇到了vector容器的erase方法的一个坑。
erase的函数原型有两种形式:
1.iterator erase(iterator position);//删除当前位置的元素。
2.iterator erase(iterator first, iterator last);//删除当前区间的元素。
vector<int> veci;
veci.push_back(1);
veci.push_back(2);
veci.push_back(3);
veci.push_back(4);
veci.push_back(4);
veci.push_back(4);
veci.push_back(2);
veci.push_back(4);
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
if( *iter == 4)
veci.erase(iter);
}
首先从代码上看,没什么毛病。但是,当veci.erase(iter)之后,迭代器iter就不知道指向的什么位置了,如果再进行 iter++ 是肯定会出错的
解决的办法:
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
if( *iter == 4)
iter = veci.erase(iter);
}
但是,1)无法删除两个连续的"4"; 2)当4位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)
最终解决方法:
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
if( *iter == 4)
iter = veci.erase(iter);
else
iter ++ ;
}