基于来自cplusplus.com的引文
如果插入发生在序列的开头或结尾,则与此容器相关的所有迭代器都将失效,但指针和引用仍然有效,指的是它们在调用之前引用的相同元素。 / em>的
为什么插入到前面或末尾会使迭代器无效而对指针和引用无效?
答案 0 :(得分:7)
基本上,deque
可以被视为vector<array<T>*>
。
换句话说,它包含一个小的索引&#34;包含指向一系列固定大小数组的指针的向量。当您在双端队列的开头或末尾插入时,它会填充第一个/最后一个数组,然后在必要时添加另一个数组,因此它永远不需要移动现有的元素。这就是指针/引用没有失效的原因。
但是,因为这个&#34;索引&#34;存储在类似向量的东西中,它可能在调整大小时被复制和重新分配,因此每次将新数组添加到索引时,索引都可能被复制到不同的内存位置。
迭代器需要足够了解容器才能迭代它。换句话说,仅知道当前指向的特定元素位于何处是不够的,还需要知道它所属的数组,以及索引所在的位置,因此它可以找到下一个/前一个数组。
这样一项操作可能会使&#34;指数失效。也会使迭代器失效,因为虽然它们仍可能指向有效元素,但它们不再能够遍历整个双端队列。
答案 1 :(得分:0)
指针仍然具有单个项目的正确内存地址,但例如:
你还有一个指向开头的迭代器吗?在这个例子中,你将错过输出中的数字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;
}
}