我的 DFS 树(C++)的意外结果
Posted
技术标签:
【中文标题】我的 DFS 树(C++)的意外结果【英文标题】:Unexpected result of my DFS tree (C++) 【发布时间】:2012-03-20 03:23:29 【问题描述】:我已经解决了这个问题!!!我发现如果我必须使用vector<Node*> children;
。但是我不太确定原因,有人可以告诉我为什么吗?谢谢:)
问题:
我使用test.cpp
生成一个树形结构,如:
(ROOT->children).size()
的结果是2
,因为root
有两个孩子。
((ROOT->children)[0].children).size()
的结果应该是2
,因为root
的第一个孩子有两个孩子。但答案是0
,为什么?这让我很困惑。
test.cpp(此代码可在 Visual Studio 2010 中运行)
#include <iostream>
#include <vector>
using namespace std;
struct Node
int len;
vector<Node> children;
Node *prev;
Node(): len(0), children(0), prev(0) ;
;
class gSpan
public:
Node *ROOT;
Node *PREV;
void read();
void insert(int);
;
int main()
gSpan g;
g.read();
system("pause");
void gSpan::read()
int value[4] = 1, 2, 2, 1;
ROOT = new Node();
PREV = ROOT;
for(int i=0; i<4; i++)
insert(value[i]);
cout << "size1: " << (ROOT->children).size() << endl; // it should output 2
cout << "size2: " << ((ROOT->children)[0].children).size() << endl; // it should output 2
system("pause");
void gSpan::insert(int v)
while(v <= PREV->len)
PREV = PREV->prev;
Node *cur = new Node();
cur->len = v;
cur->prev = PREV;
PREV->children.push_back(*cur);
PREV = cur;
【问题讨论】:
【参考方案1】:问题是您的children
向量包含Node
值而不是Node*
指针。虽然您的访问权限正确使用了 root,但它只会找到您尝试维护的子项的副本。你的所有节点也都被泄露了。
您可能希望在某些时候为您的孩子使用std::vector<Node*>
和delete
。最简单的方法可能是使用智能指针向量,例如一个 tference 计数指针,并让智能指针负责释放。
【讨论】:
我不明白这句话的意思是:it finds only copies of the children you try to maintain. All of your nodes are also leaked.
。如果我使用vector<Node> children
,那么如果我 push_back,Node
对象应该是子对象。但是为什么会消失呢?感谢您的回复。
您不会将Node
放在那里,而是将其副本放在那里。在 C++ 中,对象是值,而不是指针。如果您为每个Node
对象绘制一个矩形,为每个Node*
绘制一个箭头到相应的Node
,您可能会看到问题:当您push_back()
您的*cur
时,您放置一个新的Node
(即矩形)进入children
向量,但你有 mo 箭头。当您稍后添加一个孩子时,您可以通过箭头更改它,但是当您尝试查看您通过数组的大小时。以上是关于我的 DFS 树(C++)的意外结果的主要内容,如果未能解决你的问题,请参考以下文章