我的 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&lt;Node*&gt;delete。最简单的方法可能是使用智能指针向量,例如一个 tference 计数指针,并让智能指针负责释放。

【讨论】:

我不明白这句话的意思是:it finds only copies of the children you try to maintain. All of your nodes are also leaked.。如果我使用vector&lt;Node&gt; children,那么如果我 push_back,Node 对象应该是子对象。但是为什么会消失呢?感谢您的回复。 您不会将Node 放在那里,而是将其副本放在那里。在 C++ 中,对象是值,而不是指针。如果您为每个Node 对象绘制一个矩形,为每个Node* 绘制一个箭头到相应的Node,您可能会看到问题:当您push_back() 您的*cur 时,您放置一个新的Node(即矩形)进入children 向量,但你有 mo 箭头。当您稍后添加一个孩子时,您可以通过箭头更改它,但是当您尝试查看您通过数组的大小时。

以上是关于我的 DFS 树(C++)的意外结果的主要内容,如果未能解决你的问题,请参考以下文章

如何测试逻辑树-10中有1个意外的测试结果

SWIG:numpy 包装器的意外结果?

word2vec 算法的意外结果

为啥此代码片段返回意外结果?

在缓冲区之间移动字节时出现意外结果

C++ 中的 DFS 实现