谨记vector erase中遇到的坑(大雾

C++ vector erase迭代器失效
本文探讨了在C++中使用vector的erase方法时,迭代器失效的问题,并提供了正确的代码示例。当在循环中删除元素时,erase后的迭代器必须正确处理,避免程序崩溃。

最近在写代码时,用到了vector中的erase方法,结果运行下面看似正确的代码时发现会抛出异常!!!

#include <vector>
#include <iostream>
using namespace std;
int main(void)
{
	vector<int> vec = {1,2,3,4,5};
	for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
	{
		cout << *iter << endl;
		if (3 == *iter)
		{
			vec.erase(iter);
		}
	}

	return 0;
}

原因如下:
查看cplusplus(点击查看)文档时发现iterator进行erase操作,被删除的迭代器将会失效,上面这个代码会在iter++处崩溃
利用erase的返回值:
An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.
指向元素的新位置的迭代器,该元素位于函数调用删除的最后一个元素之后。 如果操作删除了序列中的最后一个元素,则这是容器的结尾。
上面这些摘自cpluplus网站,以上述代码为例,在erase之后返回值是指向4的,此时因为后面依然有iter++的操作,所以需要iter - -
所以应该修改如下:

#include <vector>
#include <iostream>
using namespace std;
int main(void)
{
	vector<int> vec = {1,2,3,4,5};
	for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
	{
		if (3 == *iter)
		{
			iter = vec.erase(iter);
			iter--;
		}
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值