在上篇文章中提到了关于在vector和list中的迭代器失效的情况,但是STL中的容器种类是非常多的,因此还需要再补充一些。
deque:
在双端队列中,无论是扩容还是插入(头插尾插中间插)都会导致迭代器的失效,只有当删除头尾的时候不会导致中间位置的迭代器失效,删除中间的位置都会导致迭代器失效。
双端队列内部是多个连续空间组成,当进行数据的插入删除的时候可能会导致元素的空间发生变化而导致迭代器失效,只有在头和尾的删除不会影响到别的元素从而不会导致迭代器失效,但对于头尾插入也会发生失效。
在扩容时创建一个新的缓冲区,并将原有缓冲区中的元素按顺序复制到新的缓冲区中。然后更新双端队列的指针或迭代器,使其指向新的缓冲区。这个过程中可能也改变的元素的空间,因此在扩容是会导致迭代器的失效。
对于双端队列的迭代器失效情况我还要很多需要理解的地方,还需要继续学习。
unordered_set:
在unordered_set中,无论是删除还是插入其他数据都不会使指向当前元素的迭代器失效,发生扩容也不会使迭代器失效。只有删除迭代器指向的元素才会导致迭代器失效。unordered_set底层是通过哈希表实现数据的存储,在扩容时不会像vector一样换一块空间,也就不会导致迭代器失效。
删除其他元素不会使迭代器失效。
插入元素不会使迭代器失效。
自动扩容或者手动预留空间都没有使迭代器失效。
set和multiset中的迭代器失效情况和unordered_set一样。这两个不支持扩容,因此不需要考虑扩容的情况,底层实现是红黑树,在进行数据的插入删除时应该是会改变节点的指向,但并不会改变节点的地址,也就意味着不会发生和vector一样因插入删除改变元素的位置而导致的迭代器失效。
map系列与set系列的底层实现都是一样的,对于迭代器失效情况就没有再去特别验证一下了。