推后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