Wie setzt, multimengen, maps und multimaps intern arbeiten
Wie multimengen arbeiten? Wenn ein Satz nicht haben kann ein Wert zugeordnet werden, um einen Schlüssel, der es tut, nur halten Sie die Tasten?
Auch, wie assoziative Container arbeiten? Ich meine vector und deque in der Speicher befindet sich sequenziell bedeutet, dass das löschen/entfernen (außer Anfang [deque] und am Ende [vector, deque]) sind langsam, wenn Sie groß sind.
Und Liste ist ein Satz von Zeigern, die nicht sequentiell in einem Speicher, die bewirkt, dass mehr suchen, aber schneller löschen/entfernen.
Wie sind Sätze, Karten, multimengen und multimaps speichern und wie funktionieren Sie?
- STL ist im Grunde template-code und der gesamte source-code verfügbar ist, in header-Dateien. Sie können nehmen-spezifischen code, und überprüfen Sie die interne Implementierung
- Ich denke, für eine junior-Programmierer nicht so leicht zu verstehen, die header implementiert template-code. Aber ich denke, die Allgemeine Konzepte und Anwendungsfälle für die meisten Container sind beschrieben in fast jedem C++ - Buch.
- Nicht in der Primer-C++ nach der Lektüre der assoziativen Containern. Es gibt keinen Anhaltspunkt über die Leistung und die Erklärung, wie es intern funktioniert 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese 4 Behälter werden in der Regel umgesetzt mit "Knoten". Ein Knoten ist ein Objekt, speichert ein element. In der [multi]gesetzt den Fall, das element ist nur der Wert; in die [multi]map Fall jeder Knoten speichert einen Schlüssel und seinen zugehörigen Wert. Ein Knoten speichert mehrere Zeiger zu anderen Knoten. Im Gegensatz zu einer Liste, die die Knoten in sets und maps bilden eine Struktur. Sie würden in der Regel arrangieren Sie es so, dass Zweige, die auf der "linken" von einem bestimmten Knoten haben kleinere Werte als die Knoten, während die Zweige auf der "richtigen" von einem bestimmten Knoten haben höhere Werte als die Knoten.
Operationen wie die Suche nach einem anzeigen mit Schlüssel/Wert legen, werden jetzt Recht schnell. Beginnen Sie an der root-Knoten des Baumes. Wenn das passt, sind Sie fertig. Wenn die Wurzel größer, Suche in der linken Zweig. Wenn die Wurzel kleiner ist als der Wert, den Sie suchen, führen Sie den Mauszeiger an den rechten Zweig. Wiederholen Sie, bis Sie einen Wert oder einen leeren Zweig.
Einfügen eines Elements erfolgt durch erstellen einer neuen node, das finden der Position in dem Baum, in dem es platziert werden soll, und dann einfügen der Knoten da durch verstellen der Zeiger herum. Schließlich ist es ein "rebalancing" - Betrieb, um zu verhindern, dass Ihr Baum von Ende bis alle aus dem Gleichgewicht. Im Idealfall jeder rechten und linken Zweig ist etwa die gleiche Größe. Rebalancing funktioniert durch die Verschiebung einiger Knoten von Links nach rechts oder Umgekehrt. E. g. wenn Sie Werte {1 2 3} und Ihr root-Knoten wäre 1, Sie hätte 2 und 3 auf den linken Zweig und einen leeren rechten Zweig:
Dies ist ausbalanciert, durch die Auswahl von 2 als neue root-node:
Den STL-Container verwenden Sie eine intelligentere, schneller rebalancing Technik, aber das level-of-detail, sollte keine Rolle spielen. Es ist nicht einmal angegeben, in den standard - die bessere Technik sollte verwendet werden, so dass Implementierungen unterscheiden können.
Kann es eine beliebige Implementierung, solange Sie mit den standard-Spezifikationen für die Behälter.
AFAIK, die assoziative Container implementiert sind als Binär-Bäume (red-black). Mehr details... abhängig von der Implementierung.
Alle zuordnen container-Klassen(Karte,multi-map,set,multi-set)implementiert, mit Rot und Schwarz(R-B-Baum) Baum. Also die R-B-tree implementation könnte ähnlich sein:-