浅析C++中迭代器(iterator)的失效情况

本文详细解析了C++中array、vector、deque、list、set和map等容器在删除元素时迭代器失效的问题。重点阐述了不同容器在元素删除后的迭代器状态变化及正确处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

array/vector/deque

这三种容器的内存空间连续,删除某一元素会导致其后所有元素前移。
在这里插入图片描述在这里插入图片描述
如图所示,删除某一元素后,后面的元素全都前移了一位。此时it3指向end位置。
在这里插入图片描述
依照C++规定,包括it0在内的其后迭代器全部“失效”(尽管他们有些指向的是有效位置),对这些迭代器进行任何操作(解引用、调用符号重载函数等)都会抛出错误。

解决方法:erase函数将返回下一个有效位置的迭代器

例如:

//删除2之前的所有元素
vector<int> vec{ 0,1,2,3 };
for (auto it = vec.begin(); *it != 2;)
	it = vec.erase(it);

list

对于使用链式存储结构的list,删除元素时就没有那么多顾虑了。

//删除2之前的所有元素
list<int> ls{ 0,1,2,3 };
for (auto it = ls.begin(); *it != 2;)
	it = ls.erase(it);//ls.erase(it++)也可以	

Q:为什么对于array/vector/deque删除元素时不能使用erase(it++)?
A:由于上述容器删除元素后其后元素将前移,所以erase(it++)将使it“后移”两格,这显然不符合it++的初衷,所以C++规范禁用了这一做法。
在这里插入图片描述
vec.erase(it++)语句不会报错,但之后一旦使用it就会抛出错误。

set/map

使用红黑树的set/map,本质上也是链式的存储结构,所以其迭代器失效情况同list

//删除2之前的所有元素
set<int> s{ 0,1,2,3 };
for (auto it = s.begin(); *it != 2;)
	it = s.erase(it);//s.erase(it++)也可以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值