渡された私は木のデータ構造について多くの質問をしましたが、C++で正しい方法にしなかったようです。ツリーデータ構造の作成 - 別のアプローチ
私がデータ構造を書いたやり方では、「終了」または「開始」イテレータを持つ方法について単一のやり方を考えることができませんでした。私はすべての機能をメンバーメソッドとして取り入れるというアプローチに移りました。代わりにイテレータの標準的なアプローチを使用する代わりに&アルゴリズム。
私のツリー構造の目標は、1)できるだけ早く1つのツリーから別のツリーへブランチを移動させることです。 2)各ブランチはそれ自身のツリーでなければなりません。また、ツリー上で動作するアクションも、ブランチ上で実行できる必要があります。
私が行ったことは、単純にベクトルを含むクラスを作成することです。 - ベクトルの内部には、このクラスの他のオブジェクトがあります。例(私が今直面している最大の問題は、クラスが単純に扱うには大きすぎるということであると私は、ここでは最小限の例を掲載しています):
template <typename ValTy>
class Tree {
private:
std::vector<std::unique_ptr<Tree> > subtrees;
ValTy value;
};
あなたは、私はちょうど何かを取り出すことができるこれを見ることができるようにsubtrees
- それをツリーとして使うか、それをコピーしてください。 トップレベルのツリーには、いくつのサブツリー(またはいくつのレベル)があるかについての情報がないので、「終了イテレータ」を記述することは不可能ですか?そして、std :: find()のようなアルゴリズムは、ツリー全体(およびすべてのサブツリー)に対して反復処理を行いませんか?
簡単な「分岐」構造を維持しながら、これらのアルゴリズムを使用することは可能ですか?
これを正しく理解すれば、最上位にはツリー内の各ノードのエントリがありますか? (ツリー内の各ノードはサブツリーベクトルを含む新しいレベルなので、最上位レベルでは各ノードに新しいサブツリーとイテレーターのペアが必要です)。私はこの "作品"は非常に非効率的ではないと思いますか? - ブランチを動かす(再)のは、トップレベルに向かって反復して修正する必要がありますか? – paul23
@ paul23:いいえ、* iterator *は、ツリー内の各レベルのスタックに要素を持っています。これは、ツリーを反復するのにO(log n)スペースが必要ですが、ツリーに親ポインタがない場合は回避できません。 – thiton