Nicht so weit habe ich gelernt, wie std::deque
unter der Haube implementiert ist, und entdeckte, dass es so etwas wie ein Array von Zeigern zu N-Byte-Arrays, wo die Daten tatsächlich gespeichert ist. Jetzt habe ich ein paar Fragen zu Deques.Wie wird sort für std :: deque implementiert?
Ein Bild, das über seine Struktur meines aktuelles Wissen beschreibt:
Die Fragen sind:
Wenn ein
push_front
Betrieb durchgeführt wird, und es gibt keinen freien Platz in Datenblock 0, a neuer Datenblock wird auf dem Heap zugewiesen und ein Zeiger auf diesen frisch zugewiesenen Speicher wird in ein "Map" -Array wie in gewöhnliches Array eingefügt - in O (number_of_blocks) -Zeit, ja?Wie sortiere ich dieses Biest? Kann mir nichts besseres vorstellen, als alle Daten in ein Array zu kopieren, zu sortieren und dann wieder zurück zu legen. Aber dieser Ansatz erfordert O (n) Hilfsspeicher ... Aber!
std::sort
bietet eine ähnliche Schnittstelle zum Sortieren sowohlstd::vector
als auchstd::deque
. Wie werden verschiedene Algorithmen für unterschiedliche Datenstrukturen implementiert? Verwenden einer Template-Spezialisierung? Wenn ja, warum kannstd::list
nicht mitstd::sort
sortiert werden? Oder vielleicht,std::sort
kümmert sich nicht um interne Struktur dieser Container und verwendet nur Iteratoren und Methoden, die instd::vector
undstd::deque
ähnlich sind (wieoperator[]
,size()
, etc)? Diese Idee klingt vernünftig und eine Antwort auf "warum kannstd::sort
nicht sortierenstd::list
?" wird offensichtlich.Wie werden die Datenblöcke ausgewählt? Sie werden sagen "Es ist abhängig von der Implementierung", aber bitte erzählen Sie mehr über verschiedene Implementierungen und Motivation hinter Lösungen.
benötigen hier Präzisierungen. Danke.
Die Mathematik hinter ihnen, obwohl 'std :: deque' hat Random-Access-Iteratoren, und als solche kann jeder In-Place-Sortieralgorithmus die Daten mit dieser Funktionalität sortieren und keinen O (N) zusätzlichen Speicher benötigen . 'std :: list' bietet keine Direktzugriffsiteration und ist daher nicht' std :: sort'-fähig. (es ist jedoch 'std :: list :: sort'-fähig). Siehe den Abschnitt ** Typanforderungen ** in [der Dokumentation von 'std :: sort'] (http://en.cppreference.com/w/cpp/algorithm/sort). – WhozCraig
Sie fehlen STL's Containers <- Iterator -> Algorithmusschema. Die Sortierung ist dieselbe wie bei jedem anderen Container, der über wahlfreie Zugriffsiteratoren verfügt. – 101010
'std :: sort' funktioniert auf ** jedem ** Paar von * wahlfreien Zugriff * Iteratoren. Sowohl "std :: vector" als auch "std :: deque" stellen Direktzugriffs-Iteratoren bereit, aber "std :: list" nicht. Es gibt (unbedingt) keine Template-Spezialisierung, magic oder irgendetwas, da 'std :: sort' funktioniert, indem Elemente im angegebenen Bereich getauscht werden; Dies erfordert keine wesentliche zusätzliche Speicherung und erfordert auch keine speziellen Kenntnisse des Containers/Bereichs/was auch immer hinter den Iteratoren steht. – Mankarse