1.vector迭代器失效问题
什么情况下会失效?以及失效的原因
vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个元素, 有可能导致内存空间不够用而重新分配一块大的内存
- 造成失效的其中一原因:
是因为内存的重新分配, 保留下来的迭代器不再指向容器中原来的元素
- 还有一种是删除元素,迭代器指向的空间自然就是一个无效的地址,无法再使用
使得vector迭代器失效的操作有:
- (1)执行erase方法时,指向删除节点及其之后的全部迭代器均失效;
那么我们更新迭代器试试? ok了
但是,请看下图:一样的代码,只不过vector里的元素最后一个改为0了,报错了!
为什么报错呢?
原因:只有要删除的是最后一个元素,第一套代码才会暴露问题,因为删除最后一个元素,返回下一个迭代器是个空,对空指针进行++操作肯定崩溃
正确的写法如下:这样避免删除最后一个元素还对空迭代器操作
#include<iostream> #include<vector> #include <numeric> //求和 #include <algorithm> //algorinthm 排序 using namespace std; int main() { int values1[10] = {1,2,0,3,4,5,0}; vector<int> values4(values1,values1+7);//拷贝其他类型容器(或者普通数组)中指定区域内的元素,可以创建新的 list 容器 for (auto iter = values4.begin(); iter != values4.end();) { if(*iter == 0) { iter = values4.erase(iter);//erase方法可以返回下一个有效的iterator }else { iter++; } } return 0; }