2016-08-19 4 views
3

私は質問Tree Nodes Getting Lostを調べていましたが、これはC++ 11で行うには良い練習になると思いました。私のツリーノードに欠けているリンクがあります

以下のコードが付属しています。しかし、ルート要素はノードの残りの部分に接続していないため、なぜ見つけることができません。

編集:ここでコードを見つけることができます:https://ideone.com/NCyRsx私はVisual Studioを使用しますが、私は同じ結果を得ます。

#include <iostream> 
#include <vector> 
#include <array> 

struct Node 
{ 
    int key; 
    std::vector<Node> children; 
    Node(int k) 
    { 
     key = k; 
    } 

    void Add(Node n) 
    { 
     children.push_back(n); 
    } 

    void display() 
    { 
     std::cout << "My value is " << key << std::endl; 
     std::cout << "My " << children.size() << " kid(s) are : " << std::endl; 
     for(auto n : children) 
     { 
      n.display(); 
     } 
    } 

}; 

int main() 
{ 
    constexpr int numNode = 5; // for 
    std::array<int, numNode> numbers = { 4, -1, 4, 1, 1 }; 
    std::vector<Node> nodesStorage; 

    for (int i = 0 ; i < numNode ; i++) 
    { 
     nodesStorage.push_back(Node(i)); 
    } 
    nodesStorage.push_back(Node(-1)); 

    for (int i = 0 ; i< numNode ; i++) 
    { 
     if(numbers[i] == -1) // the root 
     { 
      nodesStorage[numNode].Add(nodesStorage[i]); 
     } 
     else 
     { 
      nodesStorage[numbers[i]].Add(nodesStorage[i]); 
     } 
    } 

    nodesStorage[1].display(); 
    nodesStorage[numNode].display(); 

    return 0; 

} 
+0

コードの出力を投稿しますか?私は、 'Add'呼び出しの周りにコピーされている' Node'sが原因だと思います。 – Ohashi

+1

一つの問題は、「子供たち」に***コピー***のノードが含まれているということです。例えば、ノードへのポインタ。 –

+0

@JoachimPileborgまあ、ノード4が子供に追加された後に更新されるとは思わない。何らかの理由でルートノードの場合と思われます。だから私は混乱している。 –

答えて

3

Node::AddnodesStorageなくNode::childrenmain更新Node S中のコール(およびその逆)Node Sが値(すなわち、コピー)によって渡されるからです。コメントで指摘したように、値の代わりにポインタを使用する必要があります。

std::vector<std::shared_ptr<Node>> nodesStorage; 

によって

std::vector<Node> nodesStorage; 

を交換し、他のどこでも、あなたのコンパイラが文句修正します。ああ、あなたが#include <memory>であることを確認してください。

これは練習として行っているので、今は詳細な修正を省略しています。ここにはstd::shared_ptrstd::make_sharedの参照があります。

C++ 11(またはむしろC++ 14)では、生ポインタ、new、またはdeleteの演算子を処理することはめったにありません。代わりに、必要に応じてstd::shared_ptrまたはstd::unique_ptrを使用します。 std::shared_ptrは、std::shared_ptrが同じオブジェクトを参照していないときにそのデストラクタでdeleteを呼び出します。これにより、不要になったリソース(RAIIイディオム)が自動的に廃棄されます。

関連する問題