`

C++容器删除数据时迭代器失效

 
阅读更多

我们在做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++ stl迭代器失效的问题

    之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase 最初我的程序是酱紫的,别说话,我知道这样是有问题的...

    c++迭代器失效的情况汇总

    对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置...

    谷歌 B-Tree C++ 模板库.

    谷歌开源团队同时也表示,C++ B-tree容器也不是没有缺点,与标准STL容器不同的是,修改C++ B-tree容器,会令所有未在该容器中的迭代器失效。出于这个原因,谷歌在该库中还增加了一个“安全”容器版本,安全容器中的...

    C++ Primer第四版【中文高清扫描版】.pdf

    9.2.2 使迭代器失效的容器操作 271 9.3 顺序容器的操作 272 9.3.1 容器定义的类型别名 272 9.3.2 begin和end成员 273 9.3.3 在顺序容器中添加元素 273 9.3.4 关系操作符 277 9.3.5 容器大小的操作 278 9.3.6 访问...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     9.3.6 容器操作可能使迭代器失效 315  9.4 vector对象是如何增长的 317  9.5 额外的string操作 320  9.5.1 构造string的其他方法 321  9.5.2 改变string的其他方法 322  9.5.3 string搜索操作 325  9.5.4 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     9.3.6 容器操作可能使迭代器失效 315  9.4 vector对象是如何增长的 317  9.5 额外的string操作 320  9.5.1 构造string的其他方法 321  9.5.2 改变string的其他方法 322  9.5.3 string搜索操作 325  9.5.4 ...

    cpp-btree:现代 C++ B 树容器

    这与 Google 的原始项目不同,因为容器的行为更像现代 STL (C++17),并且几乎是直接替换(迭代器失效除外,见下文); 对于包括支持emplace和try_emplace在地图和值不需要有一个默认的构造函数。 与通常使用红黑树...

    C++中vector和map的删除方法(推荐)

    1.连续内存序列容器(vector,string,deque) 序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全...关联容器的erase方法没有返回值,被删除的迭代器失效,所以删除前必须

    C++ primer基础之容器insert

    最后才发现原来是自己对“容器insert之后迭代器会失效”的理解不够透彻。 题目如下: 假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改? auto iter = iv.begin(); auto mid = iv.begin() + iv.size...

    C++(STL库)之顺序容器vector的使用

    ④一旦内从重分配,和原vector相关的指针,引用,迭代器都失效。内存重分配耗时很长 二、头文件、using声明 头文件:#include using声明:using std::vector; 三、初始化 vector v1; ==&gt;v1是一个空的vector ...

Global site tag (gtag.js) - Google Analytics