Quelle est la différence entre les deux? Je veux dire que les méthodes sont toutes les mêmes. Ainsi, pour un utilisateur, ils fonctionnent de manière identique.
Est-ce exact??
Extrait du (daté mais toujours très utile) SGI STL résumé de deque
:
Un deque ressemble beaucoup à un vecteur: comme le vecteur, il s'agit d'une séquence qui prend en charge l'accès aléatoire aux éléments, l'insertion et la suppression d'éléments à temps constant à la fin de la séquence, et l'insertion et la suppression linéaires d'éléments au milieu.
La différence principale entre deque et vector est que deque prend également en charge l'insertion et le retrait d'éléments à temps constant au début de la séquence. En outre, deque n'a pas de fonctions membres analogues à vector's capacity () et reserve () et ne fournit aucune des garanties de validité d'itérateur associées à ces fonctions membres.
Voici le résumé sur list
du même site:
Une liste est une liste doublement liée. C'est-à-dire qu'il s'agit d'une séquence qui prend en charge à la fois la traversée vers l'avant et vers l'arrière et l'insertion et le retrait d'éléments (amortis) à temps constant au début ou à la fin, ou au milieu. Les listes ont la propriété importante que l'insertion et l'épissage n'invalident pas les itérateurs pour répertorier les éléments, et que même la suppression invalide uniquement les itérateurs qui pointent vers les éléments qui sont supprimés. L'ordre des itérateurs peut être modifié (c'est-à-dire que list :: iterator peut avoir un prédécesseur ou un successeur différent après une opération de liste), mais les itérateurs eux-mêmes ne seront pas invalidés ou forcés de pointer vers des éléments différents, sauf si cette invalidation ou la mutation est explicite.
En résumé, les conteneurs peuvent avoir des routines partagées mais les garanties de temps pour ces routines diffèrent d'un conteneur à l'autre . Ceci est très important pour déterminer lequel de ces conteneurs utiliser pour une tâche: en tenant compte de la façon dont le conteneur sera le plus fréquemment utilisé (par exemple, plus pour recherche que pour insertion/suppression) vous aide beaucoup à vous diriger vers le bon conteneur.
Permettez-moi d'énumérer les différences:
Complexité
Insert/erase at the beginning in middle at the end
Deque: Amortized constant Linear Amortized constant
List: Constant Constant Constant
std::list
est fondamentalement une liste doublement liée.
std::deque
, d'autre part, est implémenté plus comme std::vector
. Il a un temps d'accès constant par index, ainsi que l'insertion et la suppression au début et à la fin, ce qui offre des caractéristiques de performance radicalement différentes d'une liste.
Une autre garantie importante est la façon dont chaque conteneur différent stocke ses données en mémoire:
Notez que le deque a été conçu pour essayez de équilibrer les avantages du vecteur et de la liste sans leurs inconvénients respectifs. Il s'agit d'un conteneur particulièrement intéressant dans les plates-formes à mémoire limitée, par exemple les microcontrôleurs.
La stratégie de stockage de la mémoire est souvent négligée, cependant, c'est souvent l'une des raisons les plus importantes pour sélectionner le conteneur le plus approprié pour une certaine application.
Non. Un deque prend uniquement en charge l'insertion et la suppression de O(1) à l'avant et à l'arrière. Il peut par exemple être implémenté dans un vecteur avec bouclage. Puisqu'il garantit également O(1) un accès aléatoire, vous pouvez être sûr qu'il n'utilise pas (seulement) une liste doublement liée.
Les différences de performances ont été bien expliquées par d'autres. Je voulais juste ajouter que des interfaces similaires ou même identiques sont courantes dans la programmation orientée objet - une partie de la méthodologie générale de l'écriture d'un logiciel orienté objet. Vous ne devez EN AUCUN CAS supposer que deux classes fonctionnent de la même manière simplement parce qu'elles implémentent la même interface, pas plus que vous ne devriez supposer qu'un cheval fonctionne comme un chien car elles implémentent toutes les deux attack () et make_noise ().