基于来自 cplusplus.com 的引用
如果插入发生在序列的开头或结尾,则与此容器相关的所有迭代器都将失效,但指针和引用保持有效,引用它们在调用之前引用的相同元素。
为什么插入到前端或末尾会使迭代器无效,而不是指针和引用?
基本上, adeque
可以被认为是 a vector<array<T>*>
。
换句话说,它由一个小的“索引”向量组成,其中包含指向一系列固定大小数组的指针。当您在双端队列的开头或结尾插入时,它会填充第一个/最后一个数组,然后在必要时添加另一个数组,因此它永远不需要移动现有元素。这就是为什么指针/引用不会失效的原因。
然而,因为这个“索引”存储在类似向量的东西中,它可能会在调整大小时被复制和重新分配,所以每次将新数组添加到索引时,索引可能会被复制到不同的内存位置。
迭代器需要对容器有足够的了解才能对其进行迭代。换句话说,仅仅知道它当前指向的特定元素在哪里是不够的,它还需要知道它是哪个数组的一部分,以及索引在哪里,这样它才能找到下一个/上一个数组。
因此,有可能使“索引”失效的操作也会使迭代器失效,因为尽管它们可能仍指向有效元素,但它们不再能够迭代整个双端队列。
指针仍然具有各个项目的正确内存地址,但是当您例如:
你还有一个指向开头的迭代器吗?在此示例中,您将错过输出中的数字 5:
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque<int> d;
d.push_back(1);
d.push_back(2);
d.push_back(3);
deque<int>::iterator it=d.begin();
d.push_front(5);
for(;it!=d.end();++it)
{
cout << *it << endl;
}
}