2013-10-25 73 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; }; 
相关问题