std::deque
(double-ended queue) est une séquence indexée qui permet des insertions et suppressions rapides à son début et à sa fin. De plus, l'insertion et la suppression à chaque extrémité d'un deque n'invalident jamais les pointeurs ou références vers les autres éléments.
Contrairement au
std::vector
, les éléments d'un deque ne sont pas stockés de manière contiguë : les implémentations typiques utilisent une séquence de tableaux de taille fixe alloués individuellement, avec une comptabilité supplémentaire, ce qui signifie que l'accès indexé à un deque doit effectuer deux déréférencements de pointeur, comparé à l'accès indexé du vector qui n'en effectue qu'un.
Le stockage d'un deque est automatiquement étendu et réduit selon les besoins. L'extension d'un deque est moins coûteuse que l'extension d'un
std::vector
car elle n'implique pas la copie des éléments existants vers un nouvel emplacement mémoire. En revanche, les deques ont généralement un coût mémoire minimal important ; un deque contenant un seul élément doit allouer son tableau interne complet (par exemple 8 fois la taille de l'objet sur libstdc++ 64 bits ; 16 fois la taille de l'objet ou 4096 octets, selon la valeur la plus grande, sur libc++ 64 bits).
La complexité (efficacité) des opérations courantes sur les deques est la suivante :
Accès aléatoire - constant
O(1)
.
Insertion ou suppression d'éléments à la fin ou au début - constant
O(1)
.
Insertion ou suppression d'éléments - linéaire
O(n)
.
Toutes les fonctions membres de
std::deque
sont
constexpr
: il est possible de créer et d'utiliser des objets
std::deque
lors de l'évaluation d'une expression constante.
Cependant, les objets
std::deque
ne peuvent généralement pas être
constexpr
, car toute mémoire allouée dynamiquement doit être libérée lors de la même évaluation d'expression constante.
Les exigences imposées aux éléments dépendent des opérations effectivement réalisées sur le conteneur. Généralement, il est requis que le type d'élément soit un type complet et satisfasse aux exigences de
Erasable
, mais de nombreuses fonctions membres imposent des exigences plus strictes.
(depuis C++11)
Allocator
-
Un allocateur utilisé pour acquérir/libérer la mémoire et pour construire/détruire les éléments dans cette mémoire. Le type doit satisfaire aux exigences de
Allocator
.
Le comportement est indéfini
(jusqu'à C++20)
Le programme est mal formé
(depuis C++20)
si
Allocator::value_type
n'est pas identique à
T
.
Invalidation des itérateurs
Cette section est incomplète
Raison : Il subsiste encore quelques inexactitudes dans cette section, veuillez consulter les pages des fonctions membres individuelles pour plus de détails
Lors de la suppression à l'une ou l'autre extrémité du deque, les références aux éléments non supprimés ne sont pas invalidées par
erase
,
pop_front
et
pop_back
.
Un appel à
resize
avec une taille plus petite n'invalide aucune référence aux éléments non supprimés.
Un appel à
resize
avec une taille plus grande n'invalide aucune référence aux éléments du deque.
#include <deque>#include <iostream>int main(){// Créer un deque contenant des entiers
std::deque<int> d ={7, 5, 16, 8};// Ajouter un entier au début et à la fin du deque
d.push_front(13);
d.push_back(25);// Itérer et afficher les valeurs du dequefor(int n : d)std::cout<< n <<' ';std::cout<<'\n';}
Sortie :
13 7 5 16 8 25
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.