使用Vector包含结构的指针问题

Pointer problem using Vector containing structs

本文关键字:指针 问题 结构 Vector 包含 使用      更新时间:2023-10-16

我现在真的被困在如何解决以下问题:

struct node {
    int a;
    node* b;
}

我将有两个没有父节点的根节点然后有更多指向父节点的节点

vector<node> IholdAllTheNodes;
node noparent1; <--- these get returned from a method
node noparent2;
IholdAllTheNodes.pushback(noparent1);
IholdAllTheNodes.pushback(noparent2);
node withparent1; <---- i am happily points to noparent1
node withparent2; <-----i am happily points to noparent2

到目前为止一切正常

IholdAllTheNodes.pushback(withparent1) <<<< oops this causes all the pointers to move.

现在withparent节点不再指向它们的父节点,因为我已经移动了它们。

我的问题很简单,我如何在不移动原始节点指针的情况下向节点向量添加更多节点。(我不能得到一个固定的大小的向量)

如果有人有时间解释一下,为什么即使推退添加到向量列表的末尾,前面信息的位置也会发生变化?

可以调用reserve

IholdAllTheNodes.reserve(MAX_SIZE);
预先设置

以避免重新分配。它要求您事先知道MAX_SIZE。

或者

  • 建议:使其成为指针容器
  • 使其成为std::vector<shared_ptr<node> >(类似但效率较低)
  • 使其成为std::vector<node*>(类似但乏味且容易出错)
  • 建议:尽量避免使用指针。通过size_t (整数)索引将节点地址改为IholdAllTheNodes而不是

您的问题是您在向量中按值存储节点。它们可能被复制很多次。每次一个节点将被放置在不同的内存地址中。因此,您将收到指向它的不同指针,旧指针将指向无效的位置。

正如其他答案所建议的,使用任何类型的指针将节点存储在vector中。我推荐boost::ptr_vector<node>std::vector<boost::shared_ptr<node> >

编辑:

不同意reserve的建议:

是很危险的。您需要在所有可能的地方放置大的粗体警告,以便将来修改此代码的人不能忽略它。因为当你向矢量添加超过MAX_SIZE元素时,你的太空船将在太阳上燃烧。在这种情况下,我建议使用boost::array,因为它是固定大小的(因此使您的假设更明显),并且至少在调试构建

中捕获缓冲区溢出。

使用一个特定的大小调用IholdAllTheNodes.reserve(),它将保证在达到该保留数量之前,进一步的插入不会使指针失效。