[英]C++ deque: when iterators are invalidated
如果我錯了,請糾正我。 謝謝!
insert
和erase
將重新定位元素,但在插入/擦除發生位置之前的元素不會重新定位,因此它們的迭代器仍然有效。
push_back
和pop_back
不會使任何迭代器失效。
push_front
和pop_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.