STL 模板库中迭代器 iterator 失效问题

在做线上测试是涉及到vector 的相关迭代器操作,引出迭代器失效问题,这里mark一下。

如下程序是运行不起来的:

#include<iostream>
using namespace std;
#include<vector>
int main(int argc,char *argv[])
{
	vector<int> vs_int;
	vs_int.push_back(0);
	vector<int>:: iterator iter = vs_int.begin();
	vs_int.insert(vs_int.begin(),1);
	vs_int.push_back(2);
	cout << *iter << endl;
	int a;
	cin >> a;
	return 0;
}

单步调试到cout<<*iter<<endl;出就会报错。程序崩溃。


究其原因是迭代器iter失效导致的,失效的迭代器(特殊的指针)指向不定,导致在取其指定的值的时候崩溃。具体,迭代器失效的原因引用下别人博客的总结:

    首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效。那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储这个元素。于是vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间的元素被复制到新的存储空间里,接着插入新的元素,最后撤销旧的存储空间。这种情况发生,一定会导致vector容器的所有迭代器都失效。

 vector迭代器的几种失效的情况: 
1、当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。
2、当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。
3、当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值