2012-03-18 27 views
6

如果我們有一個map <int, vector<int> >vector當地圖的紅黑樹變化或它存儲指向vector s的指針或類似的東西,並且不會移動它們(否則使用地圖不會是O(lg n)再例如,如果我們的push_back元素一些vector S)是地圖<..,..>穩定的第二部分?

回答

9

見這一個: std::map, pointer to map key value, is this possible?

頂端回答:

第23.1.2#8(關聯CON TAINER要求):

「插入元件不得影響迭代器和引用到容器的有效性,並擦除成員應被擦除的元素僅無效迭代器和引用。」

所以存儲指向地圖要素的數據成員保證是有效的,除非你刪除元素。

因此,如果引用被保留,數據就不能被複制到內存的不同部分。如果是這樣的話,我不認爲在所有執行任何副本點......

+0

這並不解決核心問題:是'的std :: map'允許_move_元素? – 2012-03-18 09:23:45

+0

如果一個元素被移動了,它的指針/引用將會失效(我正在談論普通指針,而不是迭代器)。這就是爲什麼 - 不 - 不允許移動元素。 ......好吧,理論上某些實現可以將對象複製到某個位置,然後回到原來的位置,但這會有點奇怪。 – CygnusX1 2012-03-18 10:24:36

+0

雖然奇怪的是沒有這樣的要求是由'擦除'。 – 2012-03-18 11:13:45

1

沒有,矢量不會左右移動。樹的操作只是重新排列節點之間的指針。他們不會將節點或其內容移動到內存中。

1

我相信C + + 03不會保證內存中的數據的穩定性,這將是一個實現細節(實際上不是你可以安全地假設沒有測試)。

注意的迭代地圖和在內存中的實際載體的位置保存有完全不同的事情。迭代器的有效性在C++規範中有明確的定義(無論是有效的還是無效的),但樹的實際內部行爲卻不是。也就是說,任何體面的編譯器(對於發佈版本/啓用優化)都會優化實現,以便實際上不會在樹中移動時複製該向量,並且std::map的C++ 11實現將使用移動語義保證行爲。

什麼你不能假設的是,僅在內部指針移動。

+1

'的std ::地圖'需要爲在標準的所有修訂中,一個基於節點的容器,即沒有從地圖擦除的節點保持放在內存中:直到節點被擦除或地圖被破壞,迭代器和地圖元素指針都不會失效。 – 2012-03-18 10:13:48

+0

但它也保留引用(普通指針),而不僅僅是迭代器。這可以讓你爭論記憶。除非有一些奇怪的內存地址虛擬化... – CygnusX1 2012-03-18 10:25:39

相關問題