迭代器失效总结

我们经常使用STL的容器,STL中的容器包括序列式容器,关联式容器。但是在使用某些容器的时候会出现迭代器失效的问题。

1. 迭代器失效的容器类型

通常数组,链表,树结构会出现迭代器失效。
即vector,list,map(set,mulitimap, mulitiset)。

2. vector迭代器失效

失效现象
在调用erase函数进行删除某一个元素或者迭代器的时候,当前位置及以后位置的迭代器会失效。
失效原因
在删除某一迭代器或者元素的时候,会将后面的元素向前移动,导致这个元素以后的迭代器都没有指向正确的位置,并且最后一个迭代器指向的空间内容无效。
解决方法
为erase设置一个返回值,返回当前结点的下一个位置的迭代器,即iterator it =erase(pos)。

3. list迭代器失效

失效现象
在调用erase函数进行删除某一个结点时,导致这个结点的迭代器失效。
失效原因
在将结点删除以后,没有改变当前迭代器的指向。
解决方法
第一种:
为erase函数设置一个返回值,返回当前结点的下一个结点的迭代器,即 iterator it = erase (pos)。
第二种:
给erase传值时为 erase(pos++);这是因为当把当前位置传递给函数之后,自动指向下一个位置。

4. map等树结构迭代器失效

在STL中,底层为树的就是map ,set ,mulitimap ,mulitiset。
以map为例:
失效现象
在调用erase删除某一结点时,当前结点的迭代器失效。
失效原因
在将结点删除以后,没有改变当前迭代器的指向。
解决方法
由于map的erase是没有返回值的,所以我们不能用返回值方式返回下一个位置的迭代器。
但是我们可以给erase传值时为 erase(pos++);这是因为当把当前位置传递给函数之后,自动指向下一个位置。
注:map的插入,查找操作都不会造成迭代器失效的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值