容器是非常便捷常用的,经常用容器来存储多条数据,然后对数据进行增删查改。

有时要在遍历的同时删除一条数据,但是这样删除的时候程序会导致程序崩溃。

这个问题在GCC 中不会出现,而在VS2008,VS2010 中都有,其它更高VS版本未测试。

比如map 容器:

  1. map<int, string> dataMap;
  2. for (int i = ; i < ; ++i) {
  3. dataMap.insert(dataMap.end(), make_pair(i, string("str")));
  4. }
  5.  
  6. map<int, string>::iterator iter = dataMap.begin();
  7. while (iter != dataMap.end()) {if (iter->first == ) {
  8. dataMap.erase(iter);
  9. }
  10.  
  11. ++iter;
  12. }

当打印到3str后会引发一个Debug Assertion Failed!

这是因为使用erase 删除iter 后iter已经指向了一个无效的地址,这时下一轮循环的while 条件成立,这时再用iter->first 的时候程序就崩溃了。

再来看看vector

  1. vector<int> dataVec;
  2. for (int i = ; i < ; ++i) {
  3. dataVec.push_back(i);
  4. }
  5.  
  6. vector<int>::iterator iter = dataVec.begin();
  7. while (iter != dataVec.end()) {if ( == *iter) {
  8. dataVec.erase(iter);
  9. }
  10.  
  11. ++iter;
  12. }

同样也会崩溃。

对于其它容器list,deque,set,multiset,multimap 也同样会有这样的问题。

我想比较直接的办法就是把要删除的那个iter的下一个指针先临时保存一份,erase 后再重新赋值给iter,继续下一轮循环。

  1. vector<int>::iterator iter = dataVec.begin();
  2. vector<int>::iterator tempIter;
  3. while (iter != dataVec.end()) { if ( == *iter) {
  4. tempIter = iter + ;
  5. dataVec.erase(iter);
  6. iter = tempIter;
  7. } else {
  8.   ++iter;
      }
  9. }

但是这样还是会崩溃,无奈只好把erase 调用放在循环外面,把检测出要删除的iter 临时记录一份,遍历结束后再删除。

  1. vector<int>::iterator iter = dataVec.begin();
  2. vector<int>::iterator tempIter;
  3. while (iter != dataVec.end()) {
  4. cout << *iter << endl;
  5. if ( == *iter) {
  6. tempIter = iter;
  7. }
  8. ++iter;
  9. }
  10. dataVec.erase(tempIter);

这样就确保不会再出现崩溃了。

C++容器在遍历时的删除问题的更多相关文章

  1. STL容器的遍历删除

    STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...

  2. 遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    在以下四种遍历过程中,前两种会抛出ConcurrentModificationException,而后两种方法是正确的. Department类: package com.sitinspring; i ...

  3. java 集合list遍历时删除元素

    本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 import java.util.ArrayList; import java.util.Iterator; import java.util ...

  4. Java遍历时删除List、Set、Map中的元素(源码分析)

    在对List.Set.Map执行遍历删除或添加等改变集合个数的操作时,不能使用普通的while.for循环或增强for.会抛出ConcurrentModificationException异常或者没有 ...

  5. 【Java】List遍历时删除元素的正确方式

    当要删除ArrayList里面的某个元素,一不注意就容易出bug.今天就给大家说一下在ArrayList循环遍历并删除元素的问题.首先请看下面的例子: import java.util.ArrayLi ...

  6. 【原理探究】女朋友问我ArrayList遍历时删除元素的正确姿势是什么?

    简介 我们在项目开发过程中,经常会有需求需要删除ArrayList中的某个元素,而使用不正确的删除方式,就有可能抛出异常.或者在面试中,会遇到面试官询问遍历时如何正常删除元素.所以在本篇文章中,我们会 ...

  7. java list集合遍历时删除元素

    转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...

  8. Kotlin入门(16)容器的遍历方式

    Kotlin号称全面兼容Java,于是乎Java的容器类仍可在Kotlin中正常使用,包括大家熟悉的队列ArrayList.映射HashMap等等.不过Kotlin作为一门全新的语言,肯定还是要有自己 ...

  9. STL容器及算法题:删除奇数的QQ号

    最近思考到这样一个题目:在STL的set和vector容器里存储了1亿个QQ号,编写函数删除奇数QQ号. 1. STL容器简介 首先了解一下 set 和 vector 以及其他类似的 STL 容器: ...

随机推荐

  1. css基础之 联网使用bootstrap

    在<head></head>中添加 <meta charset="utf-8"> <meta http-equiv="X-UA- ...

  2. G - Bullseye

    Description A simple dartboard consists of a flat, circular piece of cork with concentric rings draw ...

  3. webapi文档

    webapi文档描述-swagger 最近做的项目使用mvc+webapi,采取前后端分离的方式,后台提供API接口给前端开发人员.这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员 ...

  4. XML的命名空间

    XML命名空间提供避免元素命名冲突的方法. 命名冲突:在XML中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突. 这个XML文档携带着某个表格中的信息: <ta ...

  5. CompressFilterAttribute 文件压缩特性

    /// <summary> /// 文件压缩特性 /// </summary> public class CompressFilterAttribute : ActionFil ...

  6. android textView 折叠 展开 ExpandableTextView

    项目过程中可能会用到可以折叠和展开的TextView , 这里给出一种实现思路,自定义控件. package com.example.expandtextviewdemo; import androi ...

  7. 如何诊断crs 安装时 root.sh 脚本执行错误

    troubleshooting root.sh problem ------*for 10g and 11.1 1.查证公网,私网的节点名是可以互相ping通的 2.---查证OCR/Voting 文 ...

  8. WindowProc和DefWindowProc的区别

    1. WindowProc是你给自己的窗口定义的窗口处理函数 DefWindowProc是windows平台提供的默认窗口处理函数 如果某些消息你不需要做特别的处理,调用DefWindowProc进行 ...

  9. 基于winform的二进制图片数据的存取(用于数据库照片的读写处理)

    编程目的:文本框1中输入id号,则从openFileDialog中选择的图片会以二进制数据存进SQL数据库的对应表的id列:文本框2中输入姓名,从数据库读取对应name的照片并显示在pictureBo ...

  10. system函数遇到的问题 - 程序死掉

    system函数遇到的问题 解决方案见最下边 http://blog.csdn.net/yangzhenzhen/article/details/51505176 这几天调程序(嵌入式linux),发 ...