簡體   English   中英

C++ deque:當迭代器失效時

[英]C++ deque: when iterators are invalidated

如果我錯了,請糾正我。 謝謝!

inserterase將重新定位元素,但在插入/擦除發生位置之前的元素不會重新定位,因此它們的迭代器仍然有效。

push_backpop_back不會使任何迭代器失效。

push_frontpop_front使所有迭代器無效。

swap不會重新定位元素,但我認為它應該使迭代器無效。

push_back()push_front()是根據insert()定義的。 同樣, pop_back()pop_front()是根據erase()定義的。

以下是 C++03 標准關於insert() (23.2.1.3/1) 的迭代器失效的說明:

在雙端隊列中間插入會使所有迭代器和對雙端隊列元素的引用無效。 在雙端隊列的任一端插入會使雙端隊列的所有迭代器無效,但對雙端隊列元素引用的有效性沒有影響。

所以push_front()push_back()迭代器失效,但對元素的引用本身仍然有效。

對於任一端的erase() (23.2.1.3/4):

雙端隊列中間的擦除會使所有迭代器和對雙端隊列元素的引用無效。 雙端隊列兩端的擦除只會使迭代器和對被擦除元素的引用無效。

因此, pop_front()pop_back()只會使對相關末尾元素的迭代器/引用無效。

據說這是關於任何標准容器的swap() (23.1/10“容器要求”):

沒有 swap() 函數使任何引用、指針或迭代器無效,這些引用、指針或迭代器引用了被交換的容器的元素。

C++11 添加了以下關於deque上的end()迭代器對這些操作的行為的說明。 基本上,應將end()的迭代器在swap()或擦除deque的最后一個元素后視為無效:

擦除雙端隊列最后一個元素的擦除操作只會使尾后迭代器和所有迭代器以及對被擦除元素的引用無效。

在交換之前引用一個容器中的元素的每個迭代器都將在交換之后引用另一個容器中的相同元素。 未指定交換前值為 a.end() 的迭代器在交換后是否具有值 b.end() 。

我認為即使您還沒有使用 C++11 編譯器,也可以像這些規則一樣進行編碼。

暫無
暫無

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

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