Pour connaître la différence, il faut savoir comment deque
est généralement mis en œuvre. La mémoire est allouée en blocs de tailles égales, et ils sont enchaînés (sous forme de tableau ou éventuellement de vecteur).
Donc, pour trouver le nième élément, vous trouvez le bloc approprié puis accédez à l'élément qu'il contient. C'est un temps constant, car il s'agit toujours exactement de 2 recherches, mais c'est encore plus que le vecteur.
vector
fonctionne également bien avec les API qui veulent un tampon contigu, car elles sont soit des API C ou sont plus polyvalentes en pouvant prendre un pointeur et une longueur. (Ainsi vous pouvez avoir un vecteur en dessous ou un tableau régulier et appeler l'API depuis votre bloc mémoire).
Où deque
a ses plus grands avantages sont:
- Lors de l'agrandissement ou de la réduction de la collection de chaque extrémité
- Lorsque vous avez affaire à de très grandes tailles de collection.
- Lorsque vous traitez avec des booléens et vous voulez vraiment des booléens plutôt qu'un ensemble de bits.
Le second d'entre eux est moins connu, mais pour de très grandes tailles de collection:
- Le coût de la réaffectation est élevé
- La surcharge de devoir trouver un bloc de mémoire contigu est restrictive, vous pouvez donc manquer de mémoire plus rapidement.
Lorsque je travaillais avec de grandes collections dans le passé et que je passais d'un modèle contigu à un modèle de bloc, nous pouvions stocker environ 5 fois plus grande collection avant de manquer de mémoire dans un système 32 bits. Ceci est en partie dû au fait que, lors de la réallocation, il devait en fait stocker l'ancien bloc ainsi que le nouveau avant de copier les éléments.
Cela dit, vous pouvez avoir des problèmes avec std::deque
les systèmes qui utilisent une allocation de mémoire «optimiste». Alors que ses tentatives de demander une grande taille de tampon pour une réallocation de a vector
seront probablement rejetées à un moment donné avec a bad_alloc
, la nature optimiste de l'allocateur est susceptible de toujours accorder la demande pour le plus petit tampon demandé par a deque
et qui est susceptible de provoquer le système d'exploitation pour tuer un processus pour essayer d'acquérir de la mémoire. Celui qu'il choisit n'est peut-être pas trop agréable.
Les solutions de contournement dans un tel cas sont soit de définir des indicateurs au niveau du système pour remplacer l'allocation optimiste (pas toujours faisable), soit de gérer la mémoire un peu plus manuellement, par exemple en utilisant votre propre allocateur qui vérifie l'utilisation de la mémoire ou similaire. Évidemment pas idéal. (Ce qui peut répondre à votre question de préférer le vecteur ...)
std::deque
a une très petite taille de bloc maximale (~ 16 octets, si je me souviens bien; peut-être 32), et en tant que telle, elle ne fonctionne pas très bien pour les applications réalistes. Undeque<T>
wheresizeof(T) > 8
(ou 16? C'est un petit nombre) a à peu près les mêmes caractéristiques de performances que avector<T*>
, où chaque élément est alloué dynamiquement. D'autres implémentations ont des tailles de bloc maximales différentes, il est donc difficile d'écrire du code qui a relativement les mêmes caractéristiques de performances sur différentes plates-formesdeque
.