簡體   English   中英

當push_back新元素添加到std :: vector時,C ++參考更改

[英]C++ reference changes when push_back new element to std::vector

我不確定該怎么做-請告訴我下面的代碼有什么問題。 我修改了代碼,將其簡化為最簡單的術語。 有一個std :: vector和一堆MyNode對象。 第一步是獲得對這些節點之一的數據元素(Data m_data)的恆定引用-在下面的示例中,插入第二個節點之前只有一個節點,如下所示:

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

多謝你們。 非常感激。

如何在向量中插入新節點,如何更改對第一個節點的數據的引用值!

因為向量的元素存儲在連續數組中。 當數組中沒有更多空間時,所有元素都將移至更大的元素,從而使所有迭代器,指針和對它們的引用無效。

我想std :: vector可能會改組一些內存,但這不應該更改引用權?

當然可以。 引用是指位於特定地址的特定對象; 如果移動了對象,它不會跟蹤。

如果需要穩定的引用,請使用deque ; 或(如果可能)使用reserve設置向量的容量,使其足以容納您可能添加的所有內容。 引用僅在需要重新分配時才無效,並且僅當您嘗試擴展到當前容量之外時才會發生。

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

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

您可以在移動指針時通過move-constructor更新指針:

A(A&& a): b(a.b) { b.ptr  = this; };

訪問http://www.cplusplus.com/reference/vector/vector/push_back/

當您嘗試添加新項目時,它將檢查下一個相鄰內存是否空閑。 如果免費,則將新項目添加到下一個可用位置,否則首先重新分配向量,並添加新項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM