2016-04-29 15 views
0

CSの私の学士時代に、私は再帰的なデータ構造の使用を何度も経験しました。 C++では、私は常にちょうど私がC.ポインタを使用しない再帰的なデータ構造

に単純化した例をどうなるのかのように、次のことができ、私のデータ構造の再帰的にするために、ポインタを使用して終了:

struct Tree{ 
    int data; 
    struct Tree *left, *right; 
}; 

しかし、ポインタを使用する傾向にあります危険な仕事であり、コードのデバッグとテストに多くの時間がかかります。これらの再帰については、C++で再帰的なデータ構造を定義する他の効率的な方法があるかどうかを知りたいと思います。他のプログラミング言語で

は、錆のように、私はそのようなことを見てきました:

struct Node { 
    children: Vec<Node>, 
    node_type: NodeType, 
} 

は、C++でこのような再帰的な構造を定義するより安全かつ快適な方法があります。 1つの可能性は、std :: Vectorを使用することですが、私はメソッドのパフォーマンスを認識していません。

+0

C++でも同じことができますが、* Treeではなく左右のTreeを作成するだけです。 – Robinson

+7

@Robinsonそれはすぐにアプリケーションを終了させるでしょう - 無限のツリーオブジェクトの作成のために:) – hauron

+1

場合によっては、例えば木のような構造のようなポインタを使用することで実際には利点*です。そうでなければ、木に子どもがいないことをどのように伝えますか?構造体に使用できる「null」値はありません。 –

答えて

2

錆の例では、子供のベクトルを使用しています。これも空にすることができます。

C++では、メンバ変数はオブジェクト、ポインタまたは参照(簡略化のため省略されている)にすることができます。

ノードオブジェクトを直接使用することはできません(これは無限ループでしょう)、あなたは、ポインタを使用したくないので、あなたのオプションは次のとおりです。

  • は、バイナリツリーのためにかかわらず、(同様のベクターを使用あなたはしかし、(キーがenum CHILD_LEFT、CHILD_RIGHTすることができる)常に2つの要素)、

  • はマップを使用するためのコードでそれを制限することができ、

  • は、ポインタを使用して再考、または - これは、最も便利なタイプではありませんより良い:スマートポインタ(これは普通のunique_ptrsの良いユースケースのようです)。

+0

参照を使用するとコードはどのようになりますか? @ジョアキム・ピレボリは、錆はそれだけであると言います。 しかし、 'unique_ptrs'を使用するオプションは、私にとっても最も合理的です。 – zakum

+1

@zakumこれは、一連の醜いハッキングを必要とします(Treeのグローバルベクトル、Treeの3つのctors:空で、子でも子でもかまいません(初期化後に変数を指すリファレンスを変更できないため)それはちょうど作成です...削除についてはどうですか?)。私は、unique_ptrsの使用を強くお勧めします。 C++では、生ポインタが*決して*オブジェクトを離れることがないならば、ちょうどそれを使用するのが安全かもしれないことに注意してください(ちょうど適切なデストラクタを記述し、Treeコンストラクタでの割り当てを避けてください)。 – hauron

+0

あなたのinteresntと時間ありがとうございます。私はあなたの答えを最高のものとして受け入れています。私は間違いなく次回に 'uniqe_ptr'を使うつもりです。 – zakum

2

ポインターが値ではなく使用されるのは、そのサイズが無限に再帰的になるため、structを決して定義できないからです。などパディングを無視

struct Tree{ 
    int data; 
    struct Tree left, right; 
}; 

は、あなたが

sizeof(Tree) == sizeof(int) + sizeof(Tree) + sizeof(Tree) 
//      ^data   ^left   ^right 

としてTreeの大きさに近づけることができますがTreeTreeの2人のメンバーを持っているので、あなたはそれを見ることができ、そしてそれらのメンバー自身が2人のTreeメンバーを持っている、そしてそれら2つのTreeのメンバーを持っています....あなたはこれがどこに行くのか見ることができます。

+0

私はそれを認識しています。しかし、C++スタイルのものを使うと、 "ガベージコレクション"のように簡単になるでしょう。 私はC++で再帰的なデータ構造を定義する方法を見つけようとしています。 私が十分明確でない場合は、std :: Vectorがメモリをどのように処理するかを考えてみてください。 – zakum

関連する問題