STLツリーがない理由はいくつかあると思います。主にツリーは、コンテナ(リスト、ベクトル、セット)のように、非常に異なる細かい構造を持つ再帰的なデータ構造の形式であり、正しい選択を難しくしています。また、STLを使用して基本的な形式で構築することも非常に簡単です。
有限ルートツリーは、値またはペイロードを持つコンテナ、たとえばクラスAのインスタンス、およびルート(サブ)ツリーのおそらく空のコレクションと考えることができます。サブツリーのコレクションが空のツリーは、葉と見なされます。
template<class A>
struct unordered_tree : std::set<unordered_tree>, A
{};
template<class A>
struct b_tree : std::vector<b_tree>, A
{};
template<class A>
struct planar_tree : std::list<planar_tree>, A
{};
イテレータの設計などについて少し考える必要があります。また、ツリー間での定義と効率化を可能にする製品と連産品の操作-元のSTLを適切に記述する必要があるため、空のセット、ベクター、またはリストコンテナーはデフォルトの場合、ペイロードは本当に空です。
木は多くの数学的構造で重要な役割を果たします(ブッチャー、グロスマン、ラーセンの古典的な論文を参照してください。それらを結合できる例と、それらを列挙するためにどのように使用するかについては、コネとクリーマーの論文も参照してください)。彼らの役割が単に他の特定の業務を促進することであると考えるのは正しくありません。むしろ、データ構造としての基本的な役割のため、これらのタスクを容易にします。
ただし、木の他に「共木」もあります。上記のツリーには、ルートを削除するとすべてを削除するというプロパティがあります。
ツリー上のイテレータについて考えてみましょう。おそらくイテレータの単純なスタックとして、ノードとその親、ルートまで実現されます。
template<class TREE>
struct node_iterator : std::stack<TREE::iterator>{
operator*() {return *back();}
...};
ただし、必要な数だけ作成できます。集合的にそれらは「ツリー」を形成しますが、すべての矢印がルートに向かう方向に流れる場合、この共ツリーはイテレータを介して自明なイテレータとルートに向かって反復できます。ただし、すべてのインスタンスを追跡することを除いて、他のイテレータを認識したり、前後に移動したりすることはできません。
ツリーは信じられないほど有用であり、それらは多くの構造を持っているので、これは決定的に正しいアプローチを得ることを深刻な課題にします。私の見解では、これがSTLに実装されていない理由です。さらに、過去に、人々が宗教的になり、独自のタイプのインスタンスを含むコンテナのタイプのアイデアに挑戦するのを見たことがあります-しかし、彼らはそれに直面しなければなりません-それはツリータイプが表すものです-それはを含むノードです(小さい)木の空のコレクション。現在の言語では、デフォルトのコンストラクターcontainer<B>
がヒープ(またはその他の場所)にスペースを割り当てないため、問題なくそれを許可していますB
。
これが、良い形で、標準への道を見つけたなら、私は喜んでいるでしょう。