容器插入后,迭代器失效吗?

3 篇文章 0 订阅
3 篇文章 0 订阅

	vector<int> v;
	v.push_back(0);
	v.push_back(1);
	v.push_back(2);

	vector<int>::iterator v_it = v.begin();
	for (; v_it != v.end(); ++v_it)
	{
		if(*v_it==1)
			v.push_back(3);
	}
	for (v_it = v.begin(); v_it != v.end(); ++v_it)
	{
		cout << *v_it << endl;
	}
编译运行的时候会出现这个断言失败:

是不是对所有容器,在插入元素在之后,如果重新分配了内存,原来的迭代器就会失效?

如果在前面加上一行代码

	vector<int> v;
	v.reserve(10);
	v.push_back(0);
	v.push_back(1);
	v.push_back(2);

	vector<int>::iterator v_it = v.begin();
	for (; v_it != v.end(); ++v_it)
	{
		if(*v_it==1)
			v.push_back(3);
	}
	for (v_it = v.begin(); v_it != v.end(); ++v_it)
	{
		cout << *v_it << endl;
	}
那么编译就不会出现失败。

但是,在Linux(Ubuntu)下,GCC 4.5.5 ,第一段的代码编译运行没有任何问题,也许是不同编译器下对迭代器段实现不同吧。


下面就总结一下关于容器大小函数的区别:
1.size()告诉你容器中目前有多少个元素,而resize则会在容器的尾部添加或者删除一些元素,来调整元素容器的实际容量,使之与指定大小一致。这两个函数对list,vector和deque使用,但对其它容器不适用。
2.capacity则告诉你最少添加多少个元素才会导致荣日重新分配内存,而reserve在必要的时候总是会使容器的内部缓冲区扩充至一个更大的容量,以确保至少能满足你指出的空间大小,这两个函数仅对vector适用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值