Ich denke, es gibt mehrere Gründe, warum es keine STL-Bäume gibt. In erster Linie sind Bäume eine Form der rekursiven Datenstruktur, die wie ein Container (Liste, Vektor, Menge) eine sehr unterschiedliche Feinstruktur aufweist, was die richtige Auswahl schwierig macht. Sie sind auch sehr einfach in Grundform mit der STL zu konstruieren.
Ein Baum mit endlichen Wurzeln kann als Container mit einem Wert oder einer Nutzlast betrachtet werden, beispielsweise als Instanz einer Klasse A und als möglicherweise leere Sammlung von verwurzelten (Unter-) Bäumen. Bäume mit leerer Sammlung von Teilbäumen werden als Blätter betrachtet.
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
{};
Man muss ein wenig über das Iterator-Design usw. nachdenken und darüber, welche Produkt- und Nebenproduktoperationen zwischen Bäumen definiert und effizient sein können - und die ursprüngliche STL muss gut geschrieben sein -, damit der leere Satz, Vektor oder Listencontainer vorhanden ist im Standardfall wirklich leer von jeglicher Nutzlast.
Bäume spielen in vielen mathematischen Strukturen eine wesentliche Rolle (siehe die klassischen Arbeiten von Butcher, Grossman und Larsen; auch die Arbeiten von Connes und Kriemer für Beispiele, wie sie zusammengefügt werden können und wie sie zur Aufzählung verwendet werden). Es ist nicht richtig zu glauben, dass ihre Rolle einfach darin besteht, bestimmte andere Operationen zu erleichtern. Sie erleichtern diese Aufgaben vielmehr aufgrund ihrer grundlegenden Rolle als Datenstruktur.
Neben Bäumen gibt es jedoch auch "Co-Bäume"; Die Bäume haben vor allem die Eigenschaft, dass Sie beim Löschen des Stamms alles löschen.
Betrachten Sie Iteratoren im Baum, wahrscheinlich würden sie als einfacher Stapel von Iteratoren für einen Knoten und dessen übergeordnetes Element bis zur Wurzel realisiert.
template<class TREE>
struct node_iterator : std::stack<TREE::iterator>{
operator*() {return *back();}
...};
Sie können jedoch so viele haben, wie Sie möchten. zusammen bilden sie einen "Baum", aber wo alle Pfeile in Richtung der Wurzel fließen, kann dieser Co-Baum durch Iteratoren in Richtung des trivialen Iterators und der Wurzel iteriert werden; Es kann jedoch nicht über oder nach unten navigiert werden (die anderen Iteratoren sind ihm nicht bekannt), und das Ensemble von Iteratoren kann nur gelöscht werden, wenn alle Instanzen im Auge behalten werden.
Bäume sind unglaublich nützlich, sie haben viel Struktur, was es zu einer ernsthaften Herausforderung macht, den definitiv richtigen Ansatz zu finden. Aus meiner Sicht sind sie deshalb nicht in der STL implementiert. Darüber hinaus habe ich in der Vergangenheit gesehen, wie Menschen religiös wurden und die Idee eines Containertyps mit Instanzen seines eigenen Typs als herausfordernd empfanden - aber sie müssen sich dem stellen - das ist, was ein Baumtyp darstellt - es ist ein Knoten, der a enthält möglicherweise leere Sammlung von (kleineren) Bäumen. Die aktuelle Sprache erlaubt es ohne Herausforderung, wenn der Standardkonstruktor für container<B>
keinen Speicherplatz auf dem Heap (oder irgendwo anders) für ein B
usw. reserviert .
Ich würde mich freuen, wenn dies in guter Form den Weg in den Standard finden würde.