2009-04-17 50 views
11

我打算實施C++中的東西列表,其中的元素可能會被無序刪除。我不指望我需要任何形式的隨機訪問(我只需要定期掃描列表),而且項目的順序也不重要。C++迭代器的生命週期和有效性是什麼?

所以我想到std::list<Thing*> with this->position = insert(lst.end(), thing)應該做的伎倆。我希望Thing班級記住每個實例的位置,以便我可以在以後輕鬆地在一段時間內輕鬆完成lst.erase(this->position)。但是,我仍然對C++ STL容器有點新鮮,而且我不知道如此長時間保持迭代器是否安全。尤其是,鑑於在插入Thing之前和之後將會刪除其他元素。

回答

13

在列表中,所有迭代器在插入過程中保持有效,只有擦除元素的迭代器在擦除過程中變得無效。

在你的情況下,即使在插入Thing *之前和之後刪除了其他元素,保持迭代器也應該沒問題。

編輯

矢量

矢量和deque其他細節

  • 插入---所有迭代器得到 無效的,如果重新分配情況, 否則其有效。
  • 擦除---- 擦除點無效後的所有迭代器。

雙端隊列

  • 插入---所有迭代器得到 無效。
  • 擦除----所有迭代器得到 無效。
+0

好的答案,這也有助於瞭解可能導致向量重新分配的原因。 (插入一個元素是顯而易見的,但是還有其他嗎?) – Malabarba 2011-10-25 21:57:19

+0

允許對矢量(包括插入和移除)的任何修改來重新分配和使迭代器失效;無論是否這樣做都是實現定義的。所以最好假定以任何方式修改矢量總是使所有現有的迭代器無效。 – Miral 2012-02-02 07:32:43

3

這取決於您使用的容器。

檢查:http://www.sgi.com/tech/stl/
看看在年底每個容器的文檔他們將在該迭代器停留在有效的情況說明。

對於std :: list <>它們在所有條件下保持有效,直到它們實際引用的元素從容器中移除(此時它們無效)。

相關問題