处理C ++中的指针和向量

时间:2013-02-23 10:25:50

标签: c++ pointers vector tree

我正在构建一个node类的树,它有两个指向子节点的指针。在构造树时,我使用节点向量进行操作,最后我将它们指向彼此。我经常需要从向量中弹出它们以维护链接过程的逻辑。不幸的是,如果我指向一个节点并将其从向量中弹出,那么对象就会被破坏(据我所知)。关于如何让我的指针指向正确的位置或更好的系统的任何想法?

编辑 - 如果它有帮助,这里有一些细节:

我有一组节点向量:Vector<node> nVec[3]

对于我需要为我的程序执行的每个解析级别,它将使用节点填充这3个向量。然后,基于其他解析数据,我将系统地链接节点。为此,我填充向量,在某个时刻我需要从nVec[3].back()中的某个节点链接到nVec[2]并将其弹出以便,如果我想再次执行此操作,我不会链接到同一个元素。

2 个答案:

答案 0 :(得分:2)

这取决于您在std::vector中存储的方式。如果您有std::vector<node>,那么是,当您从中移除它们时,存储在向量中的node对象将被销毁。

但是,如果你有一个指针向量(std::vector<node*>)并在推送它们之前动态分配你的节点(nodes.push_back(new node();)),它们将一直存在,直到你明确delete它们为止。但是,您必须记住以后delete这些节点。要安全地使用动态分配,请使用智能指针向量,例如std::vector<std::shared_ptr<node>>

答案 1 :(得分:0)

您应该存储指向vector中已有对象的指针:

vector<Node> nodes;
nodes.push_back(Node(foo));

好。

vector<Node*> nodes;
nodes.push_back(new Node(foo));

很好,因为现在节点已分配到堆上,并且在从集合中删除时不会被销毁。

我建议您使用smart pointerunique_ptrshared_ptr)来管理资源分配和解除分配,因为此时您最终可能会忘记对单个对象的引用数量有