某些对vector对象的操作会使得迭代器失效。

文章讨论了C++中Vector对象的动态增长特性,指出在范围内for循环中向Vector添加元素会导致迭代器失效。当Vector执行push_back等可能导致容量改变的操作时,其内部指针_Myfirst会更新,原有的迭代器因此变得无效,这解释了运行时错误的原因。
摘要由CSDN通过智能技术生成

C++Primer上,有这样一段描述“虽然Vector对象可以动态增长,但也会有一些副作用,已知的一个限制是不能在范围for循环中向vector对象中添加元素。另外一个限制是任何可能改变vector对象容量的操作都会使得vector迭代器失效。”

验证了一下。

	std::vector<int> v1(10, 1);
	const std::vector<int> v2 = v1;

	auto it1 = v1.begin();
	auto it2 = v2.begin();

	std::cout << typeid(it1).name() << ' '  << sizeof(it1) << *it1 << std::endl;

	std::cout << typeid(it2).name() << ' ' << *it2 << std::endl;

	v1.push_back(2);
	it1++;

	std::cout << *it1 << std::endl;

每次运行到最后一句时都会报错,显示Mycont是nullptr

然后去查看了内存。

在运行push_back之前,迭代器指向的是内存中vector的_Myfirst。

运行push_back之后,vector对象的_Myfirst发生了改变,也就是说vector的动态增长本质是建立新的长度的vector并将自身进行复制(猜测)。所以每一次动态增长后_Myfirst都发生了变化,因而过去的迭代器失效了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值