c++学习(二)vector中erase方法的注意事项

最近在编写传感器预处理的程序时,遇到了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 ++ ;
}
发布了44 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/He3he3he/article/details/88169698
今日推荐