Myślę, że istnieje kilka powodów, dla których nie ma drzew STL. Przede wszystkim Drzewa są formą rekurencyjnej struktury danych, która podobnie jak kontener (lista, wektor, zestaw), ma bardzo różną drobną strukturę, co utrudnia prawidłowe wybory. Są również bardzo łatwe do zbudowania w podstawowej formie za pomocą STL.
Skończone zrootowane drzewo może być traktowane jako pojemnik, który ma wartość lub ładunek, powiedzmy, przykład klasy A i ewentualnie pustej kolekcji ukorzenionych (pod) drzew; drzewa z pustą kolekcją poddrzewa są uważane za liście.
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
{};
Trzeba się trochę zastanowić nad projektem iteratora itp. Oraz nad tym, które operacje produktu i produktu towarzyszącego pozwalają definiować i być wydajne między drzewami - a oryginalny STL musi być dobrze napisany - aby pusty kontener, wektor lub lista była naprawdę pozbawiony ładunku w domyślnym przypadku.
Drzewa odgrywają istotną rolę w wielu strukturach matematycznych (zobacz klasyczne artykuły Butchera, Grossmana i Larsena; także w artykułach Connesa i Kriemera przykłady ich łączenia i sposobu ich wyliczania). Błędem jest myśleć, że ich rolą jest po prostu ułatwianie niektórych innych operacji. Ułatwiają one raczej te zadania ze względu na ich podstawową rolę jako struktury danych.
Jednak oprócz drzew istnieją również „współ-drzewa”; przede wszystkim drzewa mają tę właściwość, że usunięcie korzenia powoduje usunięcie wszystkiego.
Rozważ iteratory na drzewie, prawdopodobnie byłyby one realizowane jako zwykły stos iteratorów, do węzła i do jego elementu nadrzędnego ... aż do katalogu głównego.
template<class TREE>
struct node_iterator : std::stack<TREE::iterator>{
operator*() {return *back();}
...};
Możesz jednak mieć tyle, ile chcesz; wspólnie tworzą „drzewo”, ale tam, gdzie wszystkie strzały płyną w kierunku korzenia, to wspólne drzewo może być iterowane przez iteratory w kierunku trywialnego iteratora i korzenia; jednak nie można nawigować w poprzek lub w dół (inne iteratory nie są mu znane) ani też zespół iteratorów nie może zostać usunięty, chyba że śledzi wszystkie instancje.
Drzewa są niezwykle przydatne, mają dużą strukturę, co stanowi poważne wyzwanie, aby uzyskać zdecydowanie poprawne podejście. Moim zdaniem dlatego nie są one zaimplementowane w STL. Co więcej, w przeszłości widziałem ludzi religijnych i pomysł na typ kontenera zawierającego instancje własnego typu stanowił wyzwanie - ale muszą stawić temu czoła - to reprezentuje typ drzewa - jest to węzeł zawierający ewentualnie pusta kolekcja (mniejszych) drzew. Obecny język pozwala na to bez żadnych wątpliwości, zapewniając domyślny konstruktorcontainer<B>
nie przydziela miejsca na stercie (lub gdziekolwiek indziej) na B
itp.
Z jednej strony byłbym zadowolony, gdyby to w dobrej formie znalazło się w normie.