概述
C++实战宝典
介绍C++的实战知识点
逐梦编程,让中华屹立世界之巅。
文章目录
- vector迭代器失效问题
- 1、初步原因分析
- 2、更新迭代器测试
- 3、条件改变测试
- 4、最终解决方案
- 总结
- 新壁纸自取
vector迭代器失效问题
1、初步原因分析
什么情况下会失效?以及失效的原因?
简单阐述:vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个元素, 有可能导致内存空间不够用而重新分配一块大的内存;
造成失效的其中之一原因:
是因为内存的重新分配, 保留下来的迭代器不再指向容器中原来的元素
还有一种是删除元素,迭代器指向的空间自然就是一个无效的地址,无法再使用;
那么,使得vector迭代器失效的操作现象如何?如下所示:
(1)执行erase方法时,指向删除节点及其之后的全部迭代器均失效;
2、更新迭代器测试
如果我们更新迭代器尝试下? 是否就ok了?
3、条件改变测试
但是,请接着看下图:一样的代码,只不过vector里的元素最后一个改为0了,报错了!显然之前所表现得也可成为假象;
这时候报错的原因是什么?
原因:只有要删除的是最后一个元素,这一套代码才会暴露问题,因为删除最后一个元素,返回下一个迭代器是个空,对空指针进行++操作肯定崩溃;
以上图片皆为为错误写法,请勿模仿,正确代码请复制最后一段代码进行测试
4、最终解决方案
如下:这样避免删除最后一个元素还对空迭代器操作
#include<iostream>
#include<vector>
#include <numeric> //求和
#include <algorithm> //algorinthm 排序
using namespace std;
int main()
{
int valueTest[10] = { 6,9,0,3,10,8,0 };
vector<int> valueTemp(valueTest, valueTest + 7);
for (auto iter = valueTemp.begin(); iter != valueTemp.end();)
{
if (*iter == 0)
{
//erase方法可以返回下一个有效的iterator
iter = valueTemp.erase(iter);
}
else
{
iter++;
}
}
cout << "OK" << endl;
system("pause");
return 0;
}
运行结果如下:
总结
迭代器失效问题是C++编程初学者常会遇到的经典问题之一,本文讲述了删除容器元素失效的原因,还有其他因素会导致迭代器失效,后续博主会陆续更新,带着大家一起避坑,写文不易,请小伙伴们动手点点关注和赞,谢谢!
新壁纸自取
最后
以上就是动人小白菜为你收集整理的C++使用vector容器遍历时迭代器失效问题vector迭代器失效问题1、初步原因分析2、更新迭代器测试3、条件改变测试4、最终解决方案总结新壁纸自取的全部内容,希望文章能够帮你解决C++使用vector容器遍历时迭代器失效问题vector迭代器失效问题1、初步原因分析2、更新迭代器测试3、条件改变测试4、最终解决方案总结新壁纸自取所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复