推后C ++ deque的迭代器失效

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

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

但我的问题是关于std :: deque。 据我所知它是一个大块数组(c数组的c数组)。 因此,push_front()在开始处插入元素,如果没有空间,则deque分配新块,并将该元素放置在分配块的末尾。

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

这是什么意思?! 如果引用有效,则deque无法重新分配(==移动)其元素。 那么迭代器为什么会失效? 为什么不能在非移动元素插入后使用它们? 或者这个短语是否意味着我无法确定迭代器是否等于开始()或结束()和溢出?

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

PS:请不要以“标准”形式回答:“不能使用,因为标准如此”。 我想明白为什么,会发生什么。


我认为迭代器失效的原因,但引用不是可能的,因为可能deque实现指向存储元素的deque页面的指针数组。 对deque中元素的引用将直接引用“页面”中的元素。 然而,进入deque的迭代器可能依赖于指向各种页面的指针向量。

将一个新元素插入到一个或另一个末端的deque中将永远不需要重新分配和移动exsting数据页面,但可能需要添加(并因此重新分配和复制)页面指针数组,从而使依赖于前一个数组的任何迭代器失效的页面指针。

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

 +----------+               +----------+
 |         -+-------------->|          |
 +----------+               +----------+
 |         -+---------+     |          |
 +----------+         |     +----------+
 |         -+---+     |     |          |
 +----------+   |     |     +----------+ 
                |     |
                |     |
                |     |
                |     |     +----------+
                |     +---->|          |
                |           +----------+
                |           |          |
                |           +----------+
                |           |          |
                |           +----------+ 
                |           
                |           +----------+
                +---------->|          |
                            +----------+
                            |          |
                            +----------+
                            |          |
                            +----------+ 
链接地址: http://www.djcxy.com/p/73321.html

上一篇: C++ deque's iterator invalidated after push

下一篇: Confusion on iterators invalidation in deque