gpt4 book ai didi

当 push_back 新元素到 std::vector 时,C++ 引用发生变化

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:04:15 24 4
gpt4 key购买 nike

我不确定这是怎么回事 - 请告诉我下面的代码有什么问题。我修改了我的代码以将其简化为最简单的术语。有一个带有一堆 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 的值发生了变化!!我只是不明白。向 vector 中插入一个新节点如何更改对第一个节点数据的值引用?!!请注意,该值不会在“创建”第二个节点时发生变化 - 但会在插入操作到 std::vector 时发生变化。我的意思是,我想 std::vector 可能会重新洗牌一些内存,但这不应该改变引用吗??

编译器 = VS 2012

谢谢大家。非常感谢。

最佳答案

How can inserting a new node to the vector change the value reference to the data of the first node?!!

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

I suppose std::vector may reshuffle some memory, but that shouldn't change the reference right??

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

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

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

关于当 push_back 新元素到 std::vector 时,C++ 引用发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19587738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com