基本上,一个deque可以被认为是一个vector<array<T>*>.
换句话说,它包含一个小的"索引"向量,其中包含指向一系列固定大小数组的指针.当您在双端队列的开头或末尾插入时,它会填充第一个/最后一个数组,然后在必要时添加另一个数组,因此它永远不需要移动现有元素.这就是指针/引用不会失效的原因.
但是,由于此"索引"存储在类似向量的内容中,因此在调整大小时可能会复制并重新分配,因此每次将新数组添加到索引时,索引都可能会复制到不同的内存位置.
迭代器需要足够了解容器才能迭代它.换句话说,仅知道当前指向的特定元素位于何处是不够的,还需要知道它所属的数组,以及索引所在的位置,因此它可以找到下一个/前一个数组.
因此,使"索引"无效的操作也会使迭代器失效,因为虽然它们仍可能指向有效元素,但它们不再能够遍历整个双端队列.