私は、数((1,1,2)、(1,2,5)、(2、...)のタプルのソートされたリストから構築されたツリー(基本的にプレフィックスツリーですが、 1,0)など)、それぞれが単一のスカラー値(intまたはdoubleの可能性が高い)に関連付けられています。一度だけ構築されてから何度も繰り返し/検索されるので、各ノードの子を保持するためにstd :: vectorsを使用する予定です。ツリーを検索するには、std :: lower_boundを呼び出すだけで、各ノードの_childrenベクトルでバイナリ検索を行う必要があります。各ベクトルには、各ノードとそれぞれのキーのstd :: pairsが含まれています。ただし、下位ノードには、各タプルの最後のエントリとそれぞれの値からなるペアを持つベクトルが含まれている必要があります。したがって、BranchNodeとは異なる型である必要があります。コードは次のようになります。しかしC++:分岐ノードと葉ノードのクラスを分ける?
class GenNode
{
};
template<typename key_type,typename value_type>
class BranchNode : GenNode
{
void insert(std::pair< std::vector<key_type> , value_type>);
private:
std::vector< std::pair<key_type,GenNode*> > _children;
};
template<typename key_type,typename value_type>
class LeafNode : GenNode
{
private:
std::vector< std::pair<key_type,value_type> > _children;
};
、各BranchNodeの子供が他のBranchNodesまたはリーフノードのどちらかにすることができるように、両方のクラスには役に立たないGenNodeクラスから継承しなければならないので、これは、本当に醜いです...ですがこれを行うより良い方法は?
'Node'は、サブノードが追加されるまでの葉であり、分岐です。ちょうど 'Node'オブジェクトがあります。 –
私はそれを効率の理由からしたくありません。私は葉ノードに空の_childrenベクタを持たせたくないのですが、おそらく "size = 0"と他の同様のメンバを格納しているでしょう。 –
このブログ記事のコメントセクションに、異なるツリー実装のメリットについての議論があります。http ://math.andrej.com/2009/04/11/on-programming-language-design/ – Heatsink