【问题标题】:C++ deque's iterator invalidated after push_front()c++ 双端队列的迭代器在 push_front() 之后失效
【发布时间】:2010-12-12 03:38:03
【问题描述】:

刚才,我正在阅读 Josuttis 的 STL 书。

据我所知——c++ 向量是一个可以重新分配的 c 数组。所以,我明白了,为什么在 push_back() 之后所有的迭代器和引用都会失效。

但我的问题是关于 std::deque。据我所知,它是大块数组(c-array of c-arrays)。所以 push_front() 在开头插入元素,如果没有空间,则 deque 分配新块,并将元素放在分配块的末尾。

在中间的 insert() 之后,所有引用和迭代器都变得无效,我明白为什么——所有元素都被移动了。 但我真的误解了短语“......在 push_back() 和 push_front() 之后所有引用都保持有效,但迭代器无效”(可以在@standard:23.2.2.3 找到相同的短语)

这是什么意思?!如果引用有效,则 deque 无法重新分配(== 移动)其元素。那么为什么迭代器会变得无效呢?为什么我不能在插入非移动元素后使用它们?还是这句话的意思是,我不能确定迭代器是否等于 begin() 或 end() 并溢出?

另外,我想提一下,在 erase() 之后,所有迭代器和引用都保持有效(除了被擦除的 :-))。

PS:请不要以“标准”形式回答:“不能使用,因为标准是这样说的”。 我想了解为什么,会发生什么。

【问题讨论】:

    标签: c++ stl iterator deque


    【解决方案1】:

    我认为迭代器无效但引用无效的原因可能是因为可能的双端队列实现了指向存储元素的双端队列页面的指针数组。对双端队列中元素的引用将直接引用“页面”中的元素。但是,进入双端队列的迭代器可能依赖于指向各个页面的指针向量。

    将新元素插入到双端队列的一端或另一端永远不需要重新分配和移动现有数据页,但它可能需要添加(并因此重新分配和复制)页指针数组,从而使依赖于的任何迭代器无效上一个页指针数组。

    Array of pointers           
    (if this grows                 Data Pages
     and gets copied,           (these never move
     iterators are invalid)      due to insert at ends)
    -----------------          --------------------
    
     +----------+               +----------+
     |         -+-------------->|          |
     +----------+               +----------+
     |         -+---------+     |          |
     +----------+         |     +----------+
     |         -+---+     |     |          |
     +----------+   |     |     +----------+ 
                    |     |
                    |     |
                    |     |
                    |     |     +----------+
                    |     +---->|          |
                    |           +----------+
                    |           |          |
                    |           +----------+
                    |           |          |
                    |           +----------+ 
                    |           
                    |           +----------+
                    +---------->|          |
                                +----------+
                                |          |
                                +----------+
                                |          |
                                +----------+ 
    

    【讨论】:

    • 也许你是对的。但是应该如何实现迭代器,在插入新页面后变得无效。或者他们可以有字段“页数”变得不正确?
    • 我想迭代器将有两个字段:一个是指向左侧“指针数组”的指针,另一个是指向相应“数据页”的指针或偏移量正确的。因此增量将被实现为(1)增加数据页中的位置,(2)如果到达页面末尾,则增加主索引中的位置并将数据页位置重置为下一页的开头.因此,如果主索引被重新分配,迭代器就会失效。
    猜你喜欢
    • 2010-10-29
    • 2015-12-24
    • 2017-05-20
    • 2013-11-13
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2015-06-26
    相关资源
    最近更新 更多