C++ 迭代器失效及解决办法

本文探讨了迭代器失效的两种常见情况:操作已释放空间和迭代器指向错位,并通过vector类举例,提供了resize、erase等操作后的迭代器修复方法。重点讲解了如何通过重新获取迭代器避免程序崩溃和不安全性。
摘要由CSDN通过智能技术生成

迭代器失效的几种情况,以vector类为例

1. 操作已经释放的空间

我们先来看一段代码
在这里插入图片描述
这段代码乍一看好像是没有什么问题,输出第一个元素的值,那结果是不是我们想的那样?
在这里插入图片描述通过结果我们可以看出,第一次打印没有出错,但是第二次打印却报错,是为什么?

我们第一次打印完后,进行扩容,向系统申请一块更大的空间,会将原来空间的数据拷贝到新开辟的空间,最后会将原来的空间释放。但此时it指向的是原有空间,原有空间释放,it就会成为野指针。第二次打印,对it作解引用,访问已经释放的空间,程序就会崩溃并且也不安全。
在这里插入图片描述
只要涉及到扩容,会开辟新的空间,就会产生迭代器失效的问题。涉及到扩容的函数有:resize、reverse、insert、push_back、assign等。

解决方法:重新获取迭代器

在这里插入图片描述
我们可以通过重新获取迭代器的方法,解决迭代器失效的问题。

2. 迭代器指向发生了错位

vector容器中,删除一个元素,后面的元素都会向前移动一个位置,此时迭代器与原来的指向发生了变化,迭代器就会失效。
在这里插入图片描述
我们再来看一段代码:
在这里插入图片描述上面代码进行头删之后,迭代器虽然指向发生了变化,但是迭代器指向的也是一个有效元素,但为什么会失效呢?

如果要删除的pos是最后一个有效元素,删完之后,pos就会指向一个没有元素的位置,此时对pos进行操作,编译器就会报错。因此删除vector中任意位置上元素时,vs就认为该位置迭代器失效了。
在这里插入图片描述
但是在Linux中,使用erase,迭代器不会失效。
在这里插入图片描述

解决方法

iterator erase (iterator position);
erase返回值是一个迭代器,迭代器指向删除之后的下一个位置

我们只需要重新获取erase的返回值,就可以解决。
在这里插入图片描述

举例

删除vector中的所有偶数。

void test()
{
	int arr[] = { 1, 2, 3, 4, 7, 8, 12 };
	vector<int> v(arr, arr + sizeof(arr) / sizeof(arr[0]));
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		if (*it % 2 == 0)
			it = v.erase(it);//如果是偶数就直接删除,获取erase返回值
		else
			it++;//如果不是偶数,迭代器继续向前移动
	}
}

迭代器失效解决办法:在使用前,对迭代器重新赋值即可

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值