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

时间:2013-11-02 14:12:02

标签: c++ stl insert deque push-back

基于来自cplusplus.com的引文

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

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

2 个答案:

答案 0 :(得分:7)

基本上,deque可以被视为vector<array<T>*>

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

但是,因为这个&#34;索引&#34;存储在类似向量的东西中,它可能在调整大小时被复制和重新分配,因此每次将新数组添加到索引时,索引都可能被复制到不同的内存位置。

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

这样一项操作可能会使&#34;指数失效。也会使迭代器失效,因为虽然它们仍可能指向有效元素,但它们不再能够遍历整个双端队列。

答案 1 :(得分:0)

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

  1. 获取指向序列开头的迭代器
  2. 将新项目放到前面
  3. 你还有一个指向开头的迭代器吗?在这个例子中,你将错过输出中的数字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;
        }
    }