2015-08-08 91 views
2

在我的代碼的主數據結構是爲標準::矢量迭代有效性<性病::矢量<T>>

std::vector<std::vector<T>> Worldlines ; 

以我的子程序的一個予刪除和添加元素(潛在地導致所述容器的重新分配有更多的能力)到其中一個組件(比如說Worldlines[i])。

如果我有一些T在矢量Worldlines[i]其位置我保存爲std::vector<T>::iterator對象,他們可能會普遍地,如果Worldlines[i]被重新分配無效。

迭代器如何指向T屬於Worldlines[j]j != i?它們是否保證仍然有效,或者其中一個載體的重新分配可能導致其他載體的重新分配,因爲它們受載體向量的約束?

謝謝大家。

+0

我編輯的問題,以避免不同類型的迭代器之間的混淆。 –

回答

2

外部矢量的所有迭代器,包括一個指向元件Worldlines[i]是有效的迭代器。您只是更改了與元素位置相對應的迭代器所指向的對象的值。Worldlines[i]矢量未重新分配,因爲無論是否需要重新分配的操作都與矢量一起完成。

另外,向量的所有元素的迭代器也是除了元件Worldlines[i]本身可能被重新分配元件的迭代器有效。

你能想象這種情況就像你有一個指針數組(其實向量的向量是指針的動態分配的數組)。如果你改變了數組的數組本身不是重新分配和改變元素的元素的一些指針的值仍然有數組中相同的索引。:)

+1

@Vinay Shukla又是什麼? –

+0

對不起!評論錯誤的地方upvoted –

+0

我猜'所有元素的迭代器'的意思是所有迭代器的元素'Worldlines [j]'其中j!= i。 –

2

它們將保持有效。

即使vector是在同一容器中重新分配的其它載體不受影響。

基本上你可以像一個載體實現爲:

struct Vector { 
    T * begin_of_memory; 
    int number_of_allocated_elements; 
    int number_of_used_elements; 
}; 

和迭代器作爲剛剛T*

當矢量需要調整大小以便爲新元素騰出空間時,當然begin_of_memory將會改變,並且當前位於該區域中間的任何迭代器將不再可用。

Vector結構本身只是改變了它的內容和指向它仍然是有效的。

+0

我想這是因爲http://stackoverflow.com/questions/19504455/would-vector-of-vectors-be-contiguous中顯示的參數和http://stackoverflow.com/questions/10898007/stdvector-of -stdvectors-連續性。我只是想確定一下。謝謝。 –

+0

標準說這(23.3.6.5): 如果沒有重新分配發生,插入點之前的所有迭代器和引用保持有效。 –

+0

@VinayShukla這裏有什麼相關的? 「當矢量需要調整大小」意味着重新分配。 – juanchopanza

相關問題