C++ 我的DFS树的意外结果(C+;+;)
我已经解决了这个问题!!!我发现如果我必须使用向量子代码>。但我不太清楚原因,有人能告诉我为什么吗?谢谢:) 问题: 我使用C++ 我的DFS树的意外结果(C+;+;),c++,algorithm,tree,depth-first-search,C++,Algorithm,Tree,Depth First Search,我已经解决了这个问题!!!我发现如果我必须使用向量子。但我不太清楚原因,有人能告诉我为什么吗?谢谢:) 问题: 我使用test.cpp生成树结构,如: (ROOT->children.size()的结果是2,因为ROOT有两个子项 ((ROOT->children)[0].children).size()的结果应为2,因为ROOT的第一个子项有两个子项。但答案是0,为什么?我真的很困惑 test.cpp(此代码可在visual studio 2010中运行) #包括 #包括 使用名称空间std
test.cpp
生成树结构,如:
(ROOT->children.size()
的结果是2
,因为ROOT
有两个子项
((ROOT->children)[0].children).size()的结果应为2
,因为ROOT
的第一个子项有两个子项。但答案是0
,为什么?我真的很困惑
test.cpp(此代码可在visual studio 2010中运行)
#包括
#包括
使用名称空间std;
结构节点{
内伦;
媒介儿童;
节点*prev;
Node():len(0),children(0),prev(0){};
};
gSpan类{
公众:
节点*根;
节点*PREV;
无效读取();
空白插入(int);
};
int main(){
gspang;
g、 read();
系统(“暂停”);
}
void gSpan::read(){
int值[4]={1,2,2,1};
根=新节点();
PREV=根;
对于(int i=0;i而言,问题在于子节点
向量包含节点
值,而不是节点*
指针。当您的访问正确使用根节点时,它只会找到您试图维护的子节点的副本。您的所有节点也都会泄漏
您可能希望为您的孩子使用std::vector
,并在某个时候删除他们。最简单的方法可能是使用智能指针的向量,例如一个teference counted指针,并让智能指针负责释放。我不明白这句话的意思是:它只找到孩子的副本如果您使用了<代码>向量子程序<代码>,则如果我推回它,节点> /COD>对象应该是子的。但是为什么它消失了?谢谢您的回复。您不把<<代码>节点<代码>指向它,而是在它的副本中。在C++对象中是值,而不是指针。您为每个节点
对象绘制一个矩形,并为每个节点*
绘制一个箭头,指向相应的节点
,您可能会看到问题:当您推回()
您的*cur
时,您会放置一个新的节点
(即矩形)进入子对象
向量,但有一个mo箭头。以后添加子对象时,可通过箭头对其进行更改,但在尝试查看数组大小时,可通过数组对其进行更改。
#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;
}