C ++中的deque的迭代器push_front后无效()(C++ deque's ite

2019-09-03 18:02发布

刚才,我在读约祖蒂斯STL的书。

据我所知 - C ++矢量是c阵列,可以被重新分配。 所以,我明白了,为什么之后的push_back()所有迭代器和引用变为无效。

但我的问题是有关的std :: deque的。 正如我知道它是大的块(C-阵列的c数组)的数组。 所以push_front()插入元素的开始,如果没有空间,双端队列分配新的块,并在分配的块的高档场所的元素。

插入()中间经过的所有引用和迭代器失效,我明白为什么 - 所有的元素都移动。 但我真的误解了那句“......之后的push_back()和push_front()的所有引用保持有效,但迭代器并不”(同一个词组可以发现@标准:23.2.2.3)

这是什么意思?! 如果引用是有效的,比双端队列无法重新分配(==移动)的元素。 那么,为什么迭代器失效了? 为什么我不能使用它们后不移动的元素插入? 抑或这句话的意思是,我不能肯定迭代平等开始()或end()和溢出?

此外,我想提的,是擦除()之后的所有迭代器和引用保持有效(除了删除一个:-))。

PS:请不要回答“标准”的形式:“它不能使用,因为标准是这样说的。” 我想知道为什么,什么都有可能发生。

Answer 1:

我认为,之所以得到迭代器失效,但不引用可能是因为可能的双端队列实现指针数组来存储元素的双端队列的网页的。 在双端队列的元素的引用将直接引用该元素在一个“页面”。 然而,一个迭代器到双端队列可能是依赖于指向不同页面指针的载体。

插入一个新元素放入双端队列在一个或另一端将永远不需要重新分配和移动exsting数据页,但它可能需要增加(并因此重新分配和复制)页面指针数组,无效即依靠以前的阵列上的任何迭代器页面指​​针。

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

 +----------+               +----------+
 |         -+-------------->|          |
 +----------+               +----------+
 |         -+---------+     |          |
 +----------+         |     +----------+
 |         -+---+     |     |          |
 +----------+   |     |     +----------+ 
                |     |
                |     |
                |     |
                |     |     +----------+
                |     +---->|          |
                |           +----------+
                |           |          |
                |           +----------+
                |           |          |
                |           +----------+ 
                |           
                |           +----------+
                +---------->|          |
                            +----------+
                            |          |
                            +----------+
                            |          |
                            +----------+ 


文章来源: C++ deque's iterator invalidated after push_front()