STL 容器迭代器失效总结

原迭代器指的是进行操作之前保存的迭代器,包括begin()、end()以及其他位置的迭代器。

1 vector

插入元素:

(1)尾后插入push_back():size < capacity时,首迭代器不失效尾迭代失效(未重新分配空间),size == capacity时,所有迭代器均失效(需要重新分配空间)。

(2)中间插入insert(iterator, n):中间插入:size < capacity时,首迭代器不失效但插入元素之后所有迭代器失效,size == capacity时,所有迭代器均失效。

删除元素:

尾后删除pop_back():只有尾迭代失效。

中间删除erase(iterator):删除位置之后所有迭代失效。

2 deque

插入元素:

(1)尾部插入push_back()原迭代器中end()会失效,其他的都不会失效

(2)头部插入push_front()原迭代器中begin()会失效,其他的都不会失效

(3)中间插入insert(iterator, n)向前移动则导致原迭代器中插入点及插入点之前的迭代器都失效;向后移动则导致迭代器中插入点及插入点之后的迭代器都失效

删除元素:

(1)尾部删除pop_back()原迭代器中end()会失效,其他的都不会失效。

(2)头部删除pop_front()原迭代器中begin()会失效,其他的都不会失效

(3)中间删除erase(iterator):向前移动将导致原迭代器中删除点及删除点之后的迭代器失效;向后移动将导致原迭代器中删除点及删除点之前的迭代器都失效

3 list

因为list的底层结构是双向链表,所有操作都只是针对节点移动指针,不会涉及到位置变化,操作影响的范围很小。

插入元素:

(1)尾部插入push_back()原迭代器中end()会失效,其他的都不会失效

(2)头部插入push_front()原迭代器中begin()会失效,其他的都不会失效

(3)中间插入insert(iterator, n)原迭代器中插入点会失效,其他的都不会失效

删除元素:

(1)头部删除pop_front()原迭代器中begin()会失效,其他的都不会失效

(2)尾部删除pop_back()原迭代器中end()会失效,其他的都不会失效。

(3)中间删除erase(iterator)原迭代器中删除点会失效,其他的都不会失效

4 总结

尾部插入一般会导致尾部迭代器失效;

头部插入一般会导致头部迭代器失效;

尾部删除一般会导致尾部迭代器失效;

头部删除一般会导致头尾迭代器失效。

5 解决

解决迭代器失效最有效直接的方法就是在进行任何可能导致迭代器失效的操作之后,重新获取迭代器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值