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

时间:2011-09-18 20:50:55

标签: c++ stl vector

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

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.

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

我的问题是如何在不移动原始节点指针的情况下向节点向量添加更多节点。 (我无法获得矢量的固定大小)

如果有人有时间解释,为什么即使后退添加到矢量列表的末尾,前一个信息的位置也在变化?

3 个答案:

答案 0 :(得分:2)

您可以拨打 reserve

IholdAllTheNodes.reserve(MAX_SIZE);

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

可替换地,

  • 建议:将其设为Pointer Container
  • 将其设为std::vector<shared_ptr<node> >(类似但效率较低)
  • 使其成为std::vector<node*>(类似但又乏味且容易出错)
  • 建议:如果可以,请避免使用指针。通过size_t整数)索引将节点发送到IholdAllTheNodes而不是

答案 1 :(得分:1)

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

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

修改

只是不同意reserve建议:

这很危险。您需要在所有可能的位置放置大胆的警告,以便将来修改此代码的人不能省略它。因为当您向向量添加超过MAX_SIZE个元素时,您的太空飞船将在太阳上结束燃烧。在这种情况下,我建议使用boost::array,因为它是固定大小(因此使你的假设更加明确)并且至少在Debug版本中捕获缓冲区溢出

答案 2 :(得分:0)

使用特定大小调用IholdAllTheNodes.reserve(),并且它将保证在达到此类保留的ammount之前,进一步的插入不会使指针无效。