std::deque
(Double-Ended-Queue) ist eine indizierte Sequenz-Container-Klasse, die schnelles Einfügen und Löschen an ihrem Anfang und Ende ermöglicht. Darüber hinaus machen Einfüge- und Löschoperationen an beiden Enden einer Deque Zeiger oder Referenzen auf die restlichen Elemente niemals ungültig.
Im Gegensatz zu
std::vector
sind die Elemente einer deque nicht zusammenhängend gespeichert: Typische Implementierungen verwenden eine Sequenz von einzeln allokierten Arrays fester Größe mit zusätzlicher Buchhaltung, was bedeutet, dass der indizierte Zugriff auf deque zwei Pointer-Dereferenzierungen durchführen muss, verglichen mit dem indizierten Zugriff von vector, der nur eine durchführt.
Die Speicherung eines Deque wird automatisch nach Bedarf erweitert und verkleinert. Die Erweiterung eines Deque ist kostengünstiger als die Erweiterung eines
std::vector
, da sie keine Kopie der vorhandenen Elemente an einen neuen Speicherort beinhaltet. Andererseits haben Deques typischerweise hohe minimale Speicherkosten; ein Deque, das nur ein Element enthält, muss sein vollständiges internes Array allokieren (z.B. 8-fache Objektgröße auf 64-Bit libstdc++; 16-fache Objektgröße oder 4096 Bytes, je nachdem was größer ist, auf 64-Bit libc++).
Die Komplexität (Effizienz) gängiger Operationen auf Deques ist wie folgt:
Direktzugriff - konstant
O(1)
.
Einfügen oder Entfernen von Elementen am Ende oder Anfang - konstant
O(1)
.
Einfügen oder Entfernen von Elementen - linear
O(n)
.
Alle Memberfunktionen von
std::deque
sind
constexpr
: Es ist möglich,
std::deque
-Objekte in der Auswertung eines konstanten Ausdrucks zu erstellen und zu verwenden.
Allerdings können
std::deque
-Objekte im Allgemeinen nicht
constexpr
sein, da jeder dynamisch allokierte Speicher in derselben Auswertung des konstanten Ausdrucks freigegeben werden muss.
Die Anforderungen an die Elemente hängen von den tatsächlich durchgeführten Operationen auf dem Container ab. Allgemein wird gefordert, dass der Elementtyp ein vollständiger Typ ist und die Anforderungen von
Erasable
erfüllt, jedoch stellen viele Member-Funktionen strengere Anforderungen.
(seit C++11)
Allocator
-
Ein Allokator, der zur Beschaffung/Freigabe von Speicher und zur Konstruktion/Destruktion der Elemente in diesem Speicher verwendet wird. Der Typ muss die Anforderungen von
Allocator
erfüllen.
Das Verhalten ist undefiniert
(bis C++20)
Das Programm ist fehlerhaft
(seit C++20)
wenn
Allocator::value_type
nicht identisch mit
T
ist.
Iterator-Invalidierung
Dieser Abschnitt ist unvollständig
Grund: Es bestehen noch einige Ungenauigkeiten in diesem Abschnitt, siehe die jeweiligen Member-Funktionsseiten für weitere Details
Wenn am Anfang gelöscht wird - nur die gelöschten Elemente.
Wenn am Ende gelöscht wird - nur die gelöschten Elemente und der Past-the-End-Iterator.
Andernfalls - alle Iteratoren werden ungültig.
Es ist nicht spezifiziert, wann der Past-the-End-Iterator ungültig wird.
(bis C++11)
Der Past-the-End-Iterator wird ebenfalls ungültig, es sei denn, die gelöschten
Elemente befinden sich am Anfang des Containers und das letzte
Element wird nicht gelöscht.
#include <deque>#include <iostream>int main(){// Erstelle eine Deque mit Ganzzahlen
std::deque<int> d ={7, 5, 16, 8};// Füge eine Ganzzahl am Anfang und Ende der Deque hinzu
d.push_front(13);
d.push_back(25);// Iteriere und gebe Werte der Deque ausfor(int n : d)std::cout<< n <<' ';std::cout<<'\n';}
Ausgabe:
13 7 5 16 8 25
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.