我们在做c++容器的元素删除时,需要使用迭代器,并且调用erase方法时,必须传入迭代器的指针位置,

所以在删除操作进行判断满足条件删除时,将变得较为麻烦。

项目中通用解决思路一:

遍历vector向量,记录满足条件的迭代指针的位置,看做成索引计数存入vector<int>中,并且这个顺序一定是由前向后的,而如果我们按照如下规定删除,会有异常,

vector<int> index;

vector<XXX> vt;

vector<XXX>::iterator it = vt.begin();

for(int i=0; i<index.size(); i++) {

vt.erase(it + index[i]);

}

因为这样做后,删除一个元素后会打乱这个元素后的所有待删除元素的索引,故考虑由后向前遍历index。

for(int i=index.size()-1; i>=0; i--) {

vt.erase(it + index[i]);

}

这样,就避免了删除元素后打乱其后方待删除元素的索引。

在网上还有一种通用的做法是,记录erase返回的迭代指针值。

for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )
{if(* it == 8){it = arr.erase(it); //不能写成arr.erase(it);}else{++it;}
}

不能写为如下:

for(vector<int>::iterator it=arr.begin(); it!=arr.end(); it ++)
{if(* it == 8){arr.erase(it); //在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”。}
}

C++容器删除数据时迭代器失效相关推荐

  1. 容器删除元素后迭代器失效_STL 4: STL之容器:选择时机,删除元素,迭代器失效...

    一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...

  2. C++ Primer:vector删除元素时迭代器失效问题

    提示:以下所有程序是使用MinGW编译运行的.若使用VS的MSVC运行,程序会报错,因为MSVC无法解引用失效迭代器或尾后迭代器. 1. 删除尾元素 #include <iostream> ...

  3. 容器删除元素后迭代器失效_使用迭代器遍历容器元素

    迭代器为我们提供了统一的遍历容器的方式. 1.Iterator源码分析 public Iterator<E> iterator() {return new Itr(); }private ...

  4. java ps.executeupdate()不执行_求救!在删除数据时不执行executeUpdate();

    你的位置: 问答吧 -> JAVA -> 问题详情 求救!在删除数据时不执行executeUpdate(); @Override public boolean delete(UserMod ...

  5. 向顺序容器vector、string、deque、list、forward_list中插入\删除元素时迭代器、引用、指针的变化

    1.插入元素 (1)对于vector.string来说,当在某个位置插入元素后,如果内存空间重新分配,则指向任何位置的迭代器.指针.引用都会失效: 如果内存空间没有重新分配,则在插入位置之前的迭代器. ...

  6. 【C#懒蛋编程——5分钟经验分享】01逆序遍历删除,防止迭代器失效

    因为篇幅很短,所以尝试全文字写法.几分钟看完的文字也没必要用十几分钟写完是吧. foreach遍历List操作很方便,这节省了部分[]取数据和下标计算的代码.写起来很简洁.但是如果是遍历删除的话,你会 ...

  7. 读书笔记--删除数据时的提示效果在项目中的应用

    需求分析: (1)当用户单击删除按钮时,整个页面背景类似于关机效果,"删除"提示框突出显示,用户可以选"关闭"按钮,或者单击"确定"或&qu ...

  8. map:erase删除元素之后迭代器失效的问题!(iterator not incrementable)

    比如我们现在有如下代码: map<string,int>tmp; for(auto i = tmp.begin();i!=tmp.end();++i) {for(int j = 0;j&l ...

  9. Salesforce删除数据时出现Insufficient privileges的可能原因

    遇到一个诡异的情况,用户通过界面删除一条自定义Object的数据的时候出现了Insufficient privileges. 按理说,如果用户的Profile没有此Object的删除权限的话,应该连删 ...

最新文章

  1. 如何开始企业网站的需求分析?
  2. 部署WSUS2.0+SP1
  3. JFreeChart相关类中文说明
  4. 手写call,apply和bind(分析三者的用法与区别)
  5. 论文浅尝 - ACL2020 | 用于回答知识库中的多跳复杂问题的查询图生成方法
  6. linux 命令 语法,linux常用命令及语法
  7. java浮点数数转二进制的数吗_深入理解计算机系统(2.7)-二进制小数和IEEE浮点标准 - Java 技术驿站-Java 技术驿站...
  8. [转发] 老叶观点:MySQL开发规范之我见
  9. Casper Labs成为数据隐私协议联盟的创始成员
  10. 【渝粤教育】广东开放大学 外国文学专题 形成性考核 (55)
  11. 物理内存是如何组织管理的
  12. PR音频处理——音乐逐渐萎靡的效果
  13. 计算机网络一、什么是计算机网络
  14. 手机查看企业qq邮件服务器,QQ企业邮箱怎么用?手机QQ邮箱收发邮件的方法
  15. Ubuntu安装拼音输入法
  16. 电大计算机理工英语19年秋季,国家开放大学2020年秋季学期电大《理工英语1》形成性考核答案...
  17. C#中在鼠标经过Button控件时显示提示信息(弹出气泡提示框)
  18. Sublime Text 3 简体中文汉化包使用方法
  19. 最值得珍藏的420个生活小窍门
  20. 使用「语雀」搭建个人博客

热门文章

  1. WARNING: A newer version of conda exists.
  2. 2021年深度学习哪些方向比较新颖,处于上升期或者朝阳阶段,比较有研究潜力?
  3. 基于QStyledItemDelegate的例子 Star Delegate Example
  4. day02-虚拟环境安装
  5. 横琴今年建物联网基础设施
  6. 由SQL数据库转换Redis的实例
  7. 微信小程序怎么确定是息屏、返回、还是Home键操作?
  8. html+css+js中的小知识点汇聚(无序 停更)
  9. 01.LoT.UI 前后台通用框架分解系列之——小图片背景全屏显示(可自动切换背景)...
  10. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)