迭代器失效(二)

本文讨论了STL容器deque中迭代器在插入和扩容时的失效问题,以及unordered_set等容器如set、multiset和map的迭代器稳定性。deque在插入/删除头尾元素时迭代器不变,但中间位置会失效。unordered_set的迭代器在插入/删除元素时保持稳定,只有删除指定元素才失效。
摘要由CSDN通过智能技术生成

在上篇文章中提到了关于在vector和list中的迭代器失效的情况,但是STL中的容器种类是非常多的,因此还需要再补充一些。

deque:

在双端队列中,无论是扩容还是插入(头插尾插中间插)都会导致迭代器的失效,只有当删除头尾的时候不会导致中间位置的迭代器失效,删除中间的位置都会导致迭代器失效。

双端队列内部是多个连续空间组成,当进行数据的插入删除的时候可能会导致元素的空间发生变化而导致迭代器失效,只有在头和尾的删除不会影响到别的元素从而不会导致迭代器失效,但对于头尾插入也会发生失效。

在扩容时创建一个新的缓冲区,并将原有缓冲区中的元素按顺序复制到新的缓冲区中。然后更新双端队列的指针或迭代器,使其指向新的缓冲区。这个过程中可能也改变的元素的空间,因此在扩容是会导致迭代器的失效。

对于双端队列的迭代器失效情况我还要很多需要理解的地方,还需要继续学习。

unordered_set:

在unordered_set中,无论是删除还是插入其他数据都不会使指向当前元素的迭代器失效,发生扩容也不会使迭代器失效。只有删除迭代器指向的元素才会导致迭代器失效。unordered_set底层是通过哈希表实现数据的存储,在扩容时不会像vector一样换一块空间,也就不会导致迭代器失效。

删除其他元素不会使迭代器失效。

插入元素不会使迭代器失效。

自动扩容或者手动预留空间都没有使迭代器失效。

set和multiset中的迭代器失效情况和unordered_set一样。这两个不支持扩容,因此不需要考虑扩容的情况,底层实现是红黑树,在进行数据的插入删除时应该是会改变节点的指向,但并不会改变节点的地址,也就意味着不会发生和vector一样因插入删除改变元素的位置而导致的迭代器失效。

map系列与set系列的底层实现都是一样的,对于迭代器失效情况就没有再去特别验证一下了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值