2012-03-20 16 views
1

私はこの問題を解決しました!私がvector<Node*> children;を使用しなければならないことが分かった。しかし、私は非常に理由が分からない、誰かがなぜ私に教えてくれますか?感謝:)私のDFSツリーの予期せぬ結果(C++)

質問:

は、私のようなツリー構造を生成するためにtest.cppを使用します。

enter image description here

rootは2人の子供がいるので、(ROOT->children).size()の結果は、2あります。

((ROOT->children)[0].children).size()の結果は、rootの最初の子が2つの子を持つため、2である必要があります。しかし、答えは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; 

} 

答えて

3

問題はchildrenベクトルがNode値ではなくNode*のポインタが含まれていることです。あなたのアクセスは、ルートを正しく使用している間は、あなたが維持しようとしている子供のコピーだけを見つけます。すべてのノードもリークされます。

お子様の場合はstd::vector<Node*>、ある場合はdeleteとしてください。最も簡単な方法はおそらくスマートポインタのベクトルを使用することです。 teference countedポインタを持ち、スマートポインタがリリースを世話するようにします。

+0

私はこの声明が意味することを理解していません。「あなたが維持しようとしている子供のコピーのみを見つけます。あなたのすべてのノードも流出します。 'ベクトル children'を使うと、' Node'オブジェクトは私がpush_backすれば子供の中になければなりません。しかし、なぜそれが消えていますか?お返事をありがとうございます。 – LoveTW

+1

あなたはあなたが指しているがそのコピーを指している 'Node'を入れません。 C++オブジェクトでは、ポインターではなく、値mがあります。すべての 'Node'オブジェクトに対して矩形を描画し、対応する' Node'にすべての 'Node * 'の矢印を描くと、問題を見ることができます:' 'cur''を' push_back() 'すると、 '(つまり四角形)を' children'ベクトルに追加しますが、あなたはそれに対してmoの矢印を持っています。後で子を追加するときは矢印で変更しますが、サイズを見るときは配列を経由します。 –

+0

あなたの返信ありがとう!それでは:) – LoveTW