迭代器失效问题

1.概念

迭代器的底层实际上是一个指针,或者是对指针进行了封装。迭代器失效,实际上就是迭代器对应地址的空间已经释放,但我们仍然去使用,导致程序崩溃。

2.引发底层空间的改变,可能会使迭代器失效(插入数据,reverse,resize都有可能)

例如当我们运行下面的代码时就会报错

vector<int> v1(10, 5);
cout << v1.capacity() << endl;//v1的容量就是10
auto it = v1.begin();
v1.push_back(6);//此时插入就会扩容,就有空间的转移,之前的it就会失效
while (it != v1.end())
{
	cout << *it << " ";
	it++;
}
string s1("claus hello");
cout << s1.capacity();//容量为15
auto it = s1.begin();
s1.reserve(16);//此时空间迁移了,it已经失效了
while (it != s1.end())
{
	cout << *it << " ";
	it++;
}

 

3. erase删除元素后

	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(7);
	//例如我要删掉v1中的全部偶数
	auto it = v1.begin();
	while (it!= v1.end())
	{
		if (*it % 2 == 0)
		{
			v1.erase(it);//erase it位置后,后面的元素会补上来
		}
		it++;//这里++it就会导致漏查,或者结尾的时候会越界。但是由于vs的检查第一次删除后++就会报错
	}

4.解决办法

在迭代器失效后对it重新赋值即可解决问题。

vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
v1.push_back(6);
v1.push_back(7);
//例如我要删掉v1中的全部偶数
auto it = v1.begin();
while (it!= v1.end())
{
	if (*it % 2 == 0)
	{
		it = v1.erase(it);
	}
	else
	{
		it++;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值