我是靠谱客的博主 动人小白菜,最近开发中收集的这篇文章主要介绍C++使用vector容器遍历时迭代器失效问题vector迭代器失效问题1、初步原因分析2、更新迭代器测试3、条件改变测试4、最终解决方案总结新壁纸自取,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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、最终解决方案总结新壁纸自取所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部