簡體   English   中英

在push_front()之后C ++ deque的迭代器失效

[英]C++ deque's iterator invalidated after push_front()

剛才,我正在讀Josuttis的STL書。

據我所知 - c ++ vector是一個可以重新分配的c-array。 所以,據我所知,為什么在push_back()之后所有迭代器和引用都會變得無效。

但我的問題是關於std :: deque。 據我所知,它是大塊的數組(c-array的c-array)。 因此push_front()在開頭插入元素,如果沒有空格,則deque分配新塊,並將元素放在已分配塊的末尾。

在中間插入()后,所有引用和迭代器都變得無效,我理解為什么 - 所有元素都被移動。 但我真的誤解了這句話“...在push_back()和push_front()之后所有引用都保持有效,但迭代器沒有”(同樣的短語可以在@ standard:23.2.2.3找到)

這是什么意思?! 如果引用有效,則deque無法重新分配(==移動)其元素。 那么為什么迭代器變得無效呢? 為什么我不能在非移動元素插入后使用它們? 或者這句話意味着,我不能確定迭代器相等於begin()或end()和溢出?

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

PS:請不要以“標准”形式回答:“它不能被使用,因為標准是這樣說的”。 我想明白為什么,會發生什么。

我認為迭代器失效的原因但引用不是因為可能的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)
-----------------          --------------------

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM