Namensräume
Varianten
Aktionen

std::deque

Von cppreference.com
< cpp‎ | container
 
 
 
 
Definiert in Header <deque>
template<

    class T,
    class Allocator = std::allocator<T>

> class deque;
(1)
namespace pmr {

    template< class T >
    using deque = std::deque<T, std::pmr::polymorphic_allocator<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 std::deque sind constexpr: es ist möglich, std::deque-Objekte in der Auswertung eines konstanten Ausdrucks zu erstellen und zu verwenden.

Jedoch können std::deque-Objekte im Allgemeinen nicht constexpr sein, da jeder dynamisch allozierte Speicher in derselben Auswertung des konstanten Ausdrucks freigegeben werden muss.

(seit C++26)

Inhalt

[edit] Template-Parameter

T - Der Typ der Elemente.
T muss die Anforderungen von CopyAssignable und CopyConstructible erfüllen. (bis C++11)
Die auf die Elemente angewendeten Anforderungen hängen von den tatsächlichen Operationen ab, die auf dem Container ausgeführt werden. Im Allgemeinen muss der Elementtyp ein vollständiger Typ sein und die Anforderungen von Erasable erfüllen, aber viele Memberfunktionen stellen strengere Anforderungen. (seit C++11)

[Bearbeiten]

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]

[edit] Iterator-Invalidierung

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.
Andernfalls - alle Iteratoren werden ungültig.
Es ist nicht spezifiziert, wann der End-Iterator ungültig wird.(bis C++11)

Der 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.

(seit C++11)
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.
Andernfalls - keine 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)
Der End-Iterator wird ebenfalls ungültig.(seit 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[edit]
allocator_type Allocator[edit]
size_type Vorzeichenloser Ganzzahltyp (normalerweise std::size_t)[edit]
difference_type Vorzeichenbehafteter Ganzzahltyp (normalerweise std::ptrdiff_t)[edit]
Referenz value_type&[edit]
const_reference const value_type&[edit]
Zeiger

Allocator::pointer

(bis C++11)

std::allocator_traits<Allocator>::pointer

(seit C++11)
[Bearbeiten]
const_pointer

Allocator::const_pointer

(bis C++11)

std::allocator_traits<Allocator>::const_pointer

(seit C++11)
[Bearbeiten]
iterator LegacyRandomAccessIterator und ConstexprIterator(seit C++26) zu value_type[edit]
const_iterator LegacyRandomAccessIterator und ConstexprIterator(seit C++26) zu const value_type[edit]
reverse_iterator std::reverse_iterator<iterator>[edit]
const_reverse_iterator std::reverse_iterator<const_iterator>[edit]

[edit] Memberfunktionen

konstruiert das deque
(public member function) [edit]
destruiert das deque
(public member function) [edit]
weist dem Container Werte zu
(public member function) [edit]
weist dem Container Werte zu
(public member function) [edit]
weist dem Container einen Bereich von Werten zu
(public member function) [edit]
gibt den zugehörigen Allocator zurück
(public member function) [edit]
Elementzugriff
Greift mit Überprüfung auf ein bestimmtes Element zu
(public member function) [edit]
Greift auf ein bestimmtes Element zu
(public member function) [edit]
Greift auf das erste Element zu
(public member function) [edit]
Greift auf das letzte Element zu
(public member function) [edit]
Iteratoren
gibt einen Iterator zum Anfang zurück
(public member function) [edit]
(C++11)
gibt einen Iterator zum Ende zurück
(public member function) [edit]
gibt einen Reverse-Iterator zum Anfang zurück
(public member function) [edit]
(C++11)
gibt einen Reverse-Iterator zum Ende zurück
(public member function) [edit]
Kapazität
prüft, ob der Container leer ist
(public member function) [edit]
Gibt die Anzahl der Elemente zurück
(public member function) [edit]
Gibt die maximal mögliche Anzahl von Elementen zurück
(public member function) [edit]
reduziert den Speicherverbrauch durch Freigabe von ungenutztem Speicher
(public member function) [edit]
Modifizierer
leert den Inhalt
(public member function) [edit]
fügt Elemente ein
(public member function) [edit]
fügt einen Bereich von Elementen ein
(public member function) [edit]
(C++11)
konstruiert Elemente direkt (in-place)
(public member function) [edit]
entfernt Elemente
(public member function) [edit]
fügt ein Element am Ende hinzu
(public member function) [edit]
konstruiert ein Element direkt (in-place) am Ende
(public member function) [edit]
fügt einen Bereich von Elementen am Ende hinzu
(public member function) [edit]
entfernt das letzte Element
(public member function) [edit]
fügt ein Element am Anfang ein
(public member function) [edit]
konstruiert ein Element im-place am Anfang
(public member function) [edit]
fügt einen Elementbereich am Anfang hinzu
(public member function) [edit]
entfernt das erste Element
(public member function) [edit]
ändert die Anzahl der gespeicherten Elemente
(public member function) [edit]
tauscht die Inhalte
(public member function) [edit]

[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) [edit]
spezialisiert den Algorithmus std::swap
(function template) [edit]
entfernt alle Elemente, die bestimmte Kriterien erfüllen
(function template) [edit]

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 auch
CopyConstructible sein

[edit] Siehe auch

passt einen Container an, um eine Queue (FIFO-Datenstruktur) bereitzustellen
(Klassenvorlage) [edit]