【问题标题】:C++ reference changes when push_back new element to std::vector当 push_back 新元素到 std::vector 时 C++ 引用发生变化
【发布时间】:2013-11-04 10:44:32
【问题描述】:

我不知道该怎么做 - 请告诉我下面的代码有什么问题。我修改了我的代码以将其简化为最简单的术语。有一个带有一堆 MyNode 对象的 std::vector。第一步是获取对其中一个节点(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

谢谢各位。非常感谢。

【问题讨论】:

    标签: c++ c++11 reference stdvector push-back


    【解决方案1】:

    向向量中插入一个新节点如何改变对第一个节点数据的值引用?!!

    因为向量的元素存储在一个连续的数组中。当数组中没有更多空间时,所有元素都被移动到一个更大的元素中,从而使所有迭代器、指针和对它们的引用无效。

    我想 std::vector 可能会重新洗牌一些内存,但这不应该改变引用吗??

    当然会。引用是指特定地址处的特定对象;如果对象被移动,它不会跟踪它。

    如果你需要稳定的引用,那么使用deque;或者(如果可能)使用reserve 将向量的容量设置为足够大以包含您可能添加的所有内容。仅当需要重新分配时引用才会失效,并且仅当您尝试超出当前容量时才会发生这种情况。

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

    【讨论】:

      【解决方案2】:

      当您将新项目添加到向量时,其中的数据可能会重新分配以适应新项目。这意味着对项目(及其成员)的引用和指针将无效。

      【讨论】:

        【解决方案3】:

        当指针移动时,您可以通过移动构造函数更新指针:

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

        【讨论】:

          【解决方案4】:

          访问http://www.cplusplus.com/reference/vector/vector/push_back/

          当您尝试添加新项目时,它将检查下一个相邻内存是否空闲。 如果空闲,则将新项目添加到下一个可用位置,否则重新分配第一个向量并添加新项目。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-31
            • 2018-01-06
            • 2017-09-21
            • 1970-01-01
            • 1970-01-01
            • 2013-12-19
            • 1970-01-01
            • 2013-10-15
            相关资源
            最近更新 更多