deque插入迭代器与指针的无效(引用)

Yak*_*kov 3 c++ stl insert push-back deque

基于cplusplus.com的引文

如果插入发生在序列的开头或结尾,则与此容器相关的所有迭代器都将失效,但指针和引用仍然有效,指的是它们在调用之前引用的相同元素.

为什么插入到前面或末尾会使迭代器无效而对指针和引用无效?

jal*_*alf 7

基本上,一个deque可以被认为是一个vector<array<T>*>.

换句话说,它包含一个小的"索引"向量,其中包含指向一系列固定大小数组的指针.当您在双端队列的开头或末尾插入时,它会填充第一个/最后一个数组,然后在必要时添加另一个数组,因此它永远不需要移动现有元素.这就是指针/引用不会失效的原因.

但是,由于此"索引"存储在类似向量的内容中,因此在调整大小时可能会复制并重新分配,因此每次将新数组添加到索引时,索引都可能会复制到不同的内存位置.

迭代器需要足够了解容器才能迭代它.换句话说,仅知道当前指向的特定元素位于何处是不够的,还需要知道它所属的数组,以及索引所在的位置,因此它可以找到下一个/前一个数组.

因此,使"索引"无效的操作也会使迭代器失效,因为虽然它们仍可能指向有效元素,但它们不再能够遍历整个双端队列.