Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的DFS树的意外结果(C+;+;)_C++_Algorithm_Tree_Depth First Search - Fatal编程技术网

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;

}