2013-10-25 109 views
6

時,C++引用發生變化我不知道該怎麼做 - 請告訴我下面的代碼有什麼問題。我修改了我的代碼以將其簡化爲最簡單的條款。有一個std ::向量與一堆MyNode對象。第一步是對這些節點之一的數據元素(數據m_data)進行恆定引用 - 在下面的示例中,在插入第二個節點之前只有一個節點,如下所示:當push_back新元素到std :: vector

const cv::Data& currData = m_nodesVector[currIndex].GetData(); 
MyNode node(...); 
m_nodesVector.push_back(node); 

在vector :: push_back調用時,currData的值發生變化!我只是不明白。如何插入一個新的節點向量更改值引用的第一個節點的數據?!請注意,該值在「創建」第二個節點時不會改變 - 但是在插入到std :: vector中之後。我的意思是,我想std :: vector可能會重新洗牌一些內存,但是這不應該改變參考權利?

編譯器= VS 2012

謝謝你們。非常感激。

回答

14

如何插入一個新的節點到矢量改變值引用的第一個節點的數據?

因爲矢量的元素被存儲在一個連續的陣列。當數組中沒有更多空間時,所有元素都移動到一個更大的元素,使所有迭代器,指針和對它們的引用無效。

我想std :: vector可能會重新洗刷一些內存,但是不應該改變引用的權利?

當然更好些。引用是指特定地址處的特定對象;它不跟蹤移動的對象。

如果您需要穩定的引用,請使用deque;或者(如果可能的話)使用reserve來設置向量的容量足夠大,以包含您可能添加的所有內容。只有在您需要重新分配時,參考纔會失效,並且只有在您嘗試超出當前容量時纔會發生。

或者,您可以存儲對象的索引,而不是對其的引用。

3

當您向矢量添加新項目時,其中的數據可能會重新分配以適應新項目。這意味着對項目(及其成員)的引用和指針將是無效的。

0

您可以更新指針,當它移動時,通過移動構造函數:

A(A&& a): b(a.b) { b.ptr = this; }; 
相關問題