前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++ vector删除多个元素方法

c++ vector删除多个元素方法

作者头像
用户7886150
修改2021-01-19 10:20:43
2.5K0
修改2021-01-19 10:20:43
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: C++ : Vector删除所有指定的元素

转自:https://blog.csdn.net/daofengdeba/article/details/7865229 

在vector中由于有多个符合要求的元素需要删除,如果直接删除后,指针直接++就会出现问题,这是因为当erase后,iter就变成了一个野指针,对一个野指针++是一定会出现错误的。 

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); 

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++) {       if( *iter == 3)              veci.erase(iter); } 

乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。 

查看MSDN,对于erase的返回值是这样描述的:An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists,于是改代码: 

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++) {       if( *iter == 3)              iter = veci.erase(iter); } 

这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作) 

正确的代码应该为: 

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )

{

     if( *iter == 3)

          iter = veci.erase(iter);

      else

            iter ++ ;

}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档