2009-07-16 100 views
4

我正在構建另一個應用程序將使用的DLL。我希望在函數調用返回之前將全局的某些數據的當前狀態存儲在DLL的內存中,以便在下次調用函數時重用狀態。爲此,我不得不保存一些迭代器。我正在使用std :: stack來存儲所有其他數據,但我不確定是否可以使用迭代器來實現。在容器內存儲迭代器

將列表迭代器放在容器類中是否安全?如果不是的話,你能否提出一種方法來存儲指向列表中的元素的指針,以便稍後使用它?

我知道使用一個向量來存儲我的數據,而不是一個列表將允許我存儲下標並非常容易地重用它,但不幸的是我不得不使用一個std :: list。

回答

5

是的,它會正常工作。

由於還有很多其他的答案是關於這是一個特殊質量的列表迭代器,我必須指出它可以與任何迭代器一起使用,包括向量迭代器。如果矢量被修改,矢量迭代器無效的事實與將迭代器存儲在另一個容器中是否合法的問題幾乎無關 - 它是。當然,如果你做了任何使其無效的事情,迭代器可能會失效,但這與迭代器是否存儲在堆棧(或任何其他數據結構)中無關。

5

存儲迭代器應該沒問題,只要確保不要在列表副本上使用它們 - 迭代器綁定到列表的一個實例,並且不能用於副本。

也就是說,如果你這樣做:

std::list<int>::iterator it = myList.begin(); 
std::list<int> c = myList; 

c.insert (it, ...); // Error 

正如其他人指出:當然,你也應該不會被移除指向的元素無效的迭代器。

0

同樣的規則適用於存儲在局部變量中的迭代器,就像在一個更長壽命的數據結構中一樣:只要容器允許,它就會保持有效。

對於一個列表,這意味着:只要指向的節點沒有被刪除,迭代器就保持有效。當列表被銷燬時,顯然該節點被刪除...

6

僅當列表銷燬或從列表中刪除「指向」元素時,列表的迭代器纔會失效。

1

存儲列表的迭代器應該沒問題。它不會失效,除非您從已存儲迭代器的列表中刪除相同的元素。從SGI網站以下報價:

列出具有重要的屬性, 插入和拼接不 無效迭代器列表元素, 而且即使去除無效僅 指向被刪除的 元素的迭代器

但是,請注意,存儲的迭代器的前一個元素和下一個元素可能會發生更改。但迭代器本身將保持有效。

+0

他沒有說有關修改列表中任何東西,所以我看不出無效何以是擺在首位的問題。 – jalf 2009-07-16 13:05:06

-1

是的。名單是要走的路。你可以參考我的答案在這裏類似的問題: What is the lifetime and validity of C++ iterators:

+0

它可以用於任何迭代器,而不僅僅是列表。這個問題沒有說明修改列表,所以終身或有效性並不真正相關 – jalf 2009-07-16 13:05:46

2

這可能是offtopic,但只是一個提示...

要知道,你的功能(S)/數據結構很有可能是線程不安全的讀取操作。有一種基本的線程安全性,讀操作不需要同步。如果您要存儲狀態,調用者從您的結構中讀取多少內容,將會使整個概念線程不安全並且有點不自然。因爲沒有人假設讀取是全狀態操作。

如果兩個線程要調用它,它們將需要同步調用或者您的數據結構可能在競爭條件下結束。這種設計中的問題是兩個線程都必須能夠訪問公共同步變量。

我會建議做兩個重載函數。兩者都是無狀態的,但其中一個應該接受提示迭代器,從哪裏開始下一個讀取/搜索/檢索等。 STL中的分配器是如何實現的。您可以傳遞給分配器一個提示指針(默認爲0),以便更快地找到新的內存塊。

問候,
Ovanes

+0

感謝提示,ovanes。但是這個問題不會發生在我的情況中,因爲每個線程的狀態都存儲在一個單獨的地方。一次只有一個線程會從容器中讀取。我不知道我完全理解重載函數的方式,我必須閱讀Allocator,但也要感謝這個建議。聽起來很有趣 – Sahas 2009-07-17 03:06:53