std::deque
| Definiert in Header <deque> |
||
| template< class T, |
(1) | |
| namespace pmr { template< class T > |
(2) | (seit C++17) |
std::deque (double-ended queue) ist ein indizierter Sequenzcontainer, der schnelle Einfüge- und Löschoperationen sowohl am Anfang als auch am Ende erlaubt. Zusätzlich machen Einfüge- und Löschoperationen an beiden Enden eines Deque niemals Zeiger oder Referenzen auf die restlichen Elemente ungültig.
Im Gegensatz zu std::vector sind die Elemente eines Deque nicht zusammenhängend gespeichert: Typische Implementierungen verwenden eine Sequenz von einzeln allozierten Arrays fester Größe mit zusätzlicher Verwaltungsstruktur. Das bedeutet, dass der indizierte Zugriff auf ein Deque zwei Dereferenzierungen von Zeigern erfordert, verglichen mit dem indizierten Zugriff eines Vektors, der nur eine erfordert.
Der Speicher eines Deque wird bei Bedarf automatisch erweitert und verkleinert. Die Erweiterung eines Deque ist kostengünstiger als die Erweiterung eines std::vector, da sie kein Kopieren 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 komplettes internes Array allozieren (z. B. das 8-fache der Objektgröße auf 64-Bit libstdc++; das 16-fache der Objektgröße oder 4096 Bytes, je nachdem, welcher Wert größer ist, auf 64-Bit libc++).
Die Komplexität (Effizienz) gängiger Operationen auf Deques ist wie folgt:
- Zufälliger Zugriff - konstant O(1).
- Einfügen oder Entfernen von Elementen am Ende oder am Anfang - konstant O(1).
- Einfügen oder Entfernen von Elementen - linear O(n).
std::deque erfüllt die Anforderungen von Container, AllocatorAwareContainer, SequenceContainer und ReversibleContainer.
|
Alle Memberfunktionen von |
(seit C++26) |
Inhalt |
[edit] Template-Parameter
| T | - | Der Typ der Elemente.
| ||||
| Allocator | - | Ein Allokator, der zum Erwerb/Freigeben von Speicher und zum Erstellen/Zerstören 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 ill-formed(seit C++20), wenn Allocator::value_type nicht mit T übereinstimmt. |
[edit] Iterator-Invalidierung
| Dieser Abschnitt ist unvollständig Grund: Es gibt noch einige Ungenauigkeiten in diesem Abschnitt, für weitere Details siehe die einzelnen Memberfunktionsseiten. |
| Operationen | Invalidiert | ||
|---|---|---|---|
| Alle schreibgeschützten Operationen. | Niemals. | ||
| swap, std::swap | Der End-Iterator kann ungültig werden (implementierungsabhängig). | ||
| shrink_to_fit, clear, insert, emplace, push_front, push_back, emplace_front, emplace_back |
Immer. | ||
| erase | Beim Löschen am Anfang - nur die gelöschten Elemente. Beim Löschen am Ende - nur die gelöschten Elemente und der End-Iterator.
| ||
| resize | Wenn die neue Größe kleiner als die alte ist - nur die gelöschten Elemente und der End-Iterator. Wenn die neue Größe größer als die alte ist - alle Iteratoren werden ungültig. | ||
| pop_front, pop_back | Auf das gelöschte Element. Der End-Iterator kann ungültig werden (implementierungsabhängig).(bis C++11) |
[edit] Hinweise zur Invalidierung
- Beim Einfügen an beiden Enden des Deque werden Referenzen durch insert und emplace nicht ungültig.
- push_front, push_back, emplace_front und emplace_back machen keine Referenzen auf Elemente des Deque ungültig.
- Beim Löschen an beiden Enden des Deque werden Referenzen auf nicht gelöschte Elemente durch erase, pop_front und pop_back nicht ungültig.
- Ein Aufruf von resize mit einer kleineren Größe macht keine Referenzen auf nicht gelöschte Elemente ungültig.
- Ein Aufruf von resize mit einer größeren Größe macht keine Referenzen auf Elemente des Deque ungültig.
[edit] Member-Typen
| Mitgliedertyp | Definition | ||||
value_type
|
T | ||||
allocator_type
|
Allocator | ||||
size_type
|
Vorzeichenloser Ganzzahltyp (normalerweise std::size_t) | ||||
difference_type
|
Vorzeichenbehafteter Ganzzahltyp (normalerweise std::ptrdiff_t) | ||||
Referenz
|
value_type& | ||||
const_reference
|
const value_type& | ||||
Zeiger
|
| ||||
const_pointer
|
| ||||
iterator
|
LegacyRandomAccessIterator und ConstexprIterator(seit C++26) zu value_type | ||||
const_iterator
|
LegacyRandomAccessIterator und ConstexprIterator(seit C++26) zu const value_type | ||||
reverse_iterator
|
std::reverse_iterator<iterator> | ||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[edit] Memberfunktionen
konstruiert das deque(public member function) | |
destruiert das deque(public member function) | |
| weist dem Container Werte zu (public member function) | |
| weist dem Container Werte zu (public member function) | |
| (C++23) |
weist dem Container einen Bereich von Werten zu (public member function) |
| gibt den zugehörigen Allocator zurück (public member function) | |
Elementzugriff | |
| Greift mit Überprüfung auf ein bestimmtes Element zu (public member function) | |
| Greift auf ein bestimmtes Element zu (public member function) | |
| Greift auf das erste Element zu (public member function) | |
| Greift auf das letzte Element zu (public member function) | |
Iteratoren | |
| (C++11) |
gibt einen Iterator zum Anfang zurück (public member function) |
| (C++11) |
gibt einen Iterator zum Ende zurück (public member function) |
| (C++11) |
gibt einen Reverse-Iterator zum Anfang zurück (public member function) |
| (C++11) |
gibt einen Reverse-Iterator zum Ende zurück (public member function) |
Kapazität | |
| prüft, ob der Container leer ist (public member function) | |
| Gibt die Anzahl der Elemente zurück (public member function) | |
| Gibt die maximal mögliche Anzahl von Elementen zurück (public member function) | |
| (DR*) |
reduziert den Speicherverbrauch durch Freigabe von ungenutztem Speicher (public member function) |
Modifizierer | |
| leert den Inhalt (public member function) | |
| fügt Elemente ein (public member function) | |
| (C++23) |
fügt einen Bereich von Elementen ein (public member function) |
| (C++11) |
konstruiert Elemente direkt (in-place) (public member function) |
| entfernt Elemente (public member function) | |
| fügt ein Element am Ende hinzu (public member function) | |
| (C++11) |
konstruiert ein Element direkt (in-place) am Ende (public member function) |
| (C++23) |
fügt einen Bereich von Elementen am Ende hinzu (public member function) |
| entfernt das letzte Element (public member function) | |
| fügt ein Element am Anfang ein (public member function) | |
| (C++11) |
konstruiert ein Element im-place am Anfang (public member function) |
| (C++23) |
fügt einen Elementbereich am Anfang hinzu (public member function) |
| entfernt das erste Element (public member function) | |
| ändert die Anzahl der gespeicherten Elemente (public member function) | |
| tauscht die Inhalte (public member function) | |
[edit] Nicht-Member-Funktionen
| (entfernt in C++20)(entfernt in C++20)(entfernt in C++20)(entfernt in C++20)(entfernt in C++20)(C++20) |
vergleicht die Werte zweier deques lexikographisch(function template) |
| spezialisiert den Algorithmus std::swap (function template) | |
| entfernt alle Elemente, die bestimmte Kriterien erfüllen (function template) |
Deduction Guides |
(seit C++17) |
[edit] Notizen
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | Bereichskonstruktion und -einfügung für Container |
__cpp_lib_constexpr_containers |
202502L |
(C++26) | constexpr std::deque |
[edit] Beispiel
#include <deque> #include <iostream> int main() { // Create a deque containing integers std::deque<int> d = {7, 5, 16, 8}; // Add an integer to the beginning and end of the deque d.push_front(13); d.push_back(25); // Iterate and print values of deque for (int n : d) std::cout << n << ' '; std::cout << '\n'; }
Ausgabe
13 7 5 16 8 25
[edit] Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 230 | C++98 | T musste nicht CopyConstructible sein(ein Element vom Typ T konnte möglicherweise nicht konstruiert werden) |
T muss auchCopyConstructible sein |
[edit] Siehe auch
| passt einen Container an, um eine Queue (FIFO-Datenstruktur) bereitzustellen (Klassenvorlage) |