3

基于来自 cplusplus.com 的引用

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

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

4

2 回答 2

7

基本上, adeque可以被认为是 a vector<array<T>*>

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

然而,因为这个“索引”存储在类似向量的东西中,它可能会在调整大小时被复制和重新分配,所以每次将新数组添加到索引时,索引可能会被复制到不同的内存位置。

迭代器需要对容器有足够的了解才能对其进行迭代。换句话说,仅仅知道它当前指向的特定元素在哪里是不够的,它还需要知道它是哪个数组的一部分,以及索引在哪里,这样它才能找到下一个/上一个数组。

因此,有可能使“索引”失效的操作也会使迭代器失效,因为尽管它们可能仍指向有效元素,但它们不再能够迭代整个双端队列。

于 2013-11-02T14:30:26.410 回答
0

指针仍然具有各个项目的正确内存地址,但是当您例如:

  1. 获得一个指向序列开头的迭代器
  2. 在前面插入新项目

你还有一个指向开头的迭代器吗?在此示例中,您将错过输出中的数字 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;
    }
}
于 2013-11-02T14:23:17.237 回答