我们在做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++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase 最初我的程序是酱紫的,别说话,我知道这样是有问题的...
对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置...
谷歌开源团队同时也表示,C++ B-tree容器也不是没有缺点,与标准STL容器不同的是,修改C++ B-tree容器,会令所有未在该容器中的迭代器失效。出于这个原因,谷歌在该库中还增加了一个“安全”容器版本,安全容器中的...
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 访问...
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 ...
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 ...
这与 Google 的原始项目不同,因为容器的行为更像现代 STL (C++17),并且几乎是直接替换(迭代器失效除外,见下文); 对于包括支持emplace和try_emplace在地图和值不需要有一个默认的构造函数。 与通常使用红黑树...
1.连续内存序列容器(vector,string,deque) 序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全...关联容器的erase方法没有返回值,被删除的迭代器失效,所以删除前必须
最后才发现原来是自己对“容器insert之后迭代器会失效”的理解不够透彻。 题目如下: 假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改? auto iter = iv.begin(); auto mid = iv.begin() + iv.size...
④一旦内从重分配,和原vector相关的指针,引用,迭代器都失效。内存重分配耗时很长 二、头文件、using声明 头文件:#include using声明:using std::vector; 三、初始化 vector v1; ==>v1是一个空的vector ...