web-dev-qa-db-fra.com

Quelle est la différence entre les conteneurs STL deque et list?

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??

76
Lazer

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.

48
fbrereto

Permettez-moi d'énumérer les différences:

  • Deque gère ses éléments avec un tableau dynamique , fournit un accès aléatoire , et a presque la même interface qu'un vecteur.
  • List gère ses éléments comme une liste doublement liée et ne fournit pas d'accès aléatoire .

  • Deque fournit des insertions et suppressions rapides à la fin et au début. L'insertion et la suppression d'éléments au milieu est relativement lente car tous les éléments jusqu'aux deux extrémités peuvent être déplacés pour faire de la place ou pour combler un espace.
  • Dans List, l'insertion et la suppression d'éléments sont rapides à chaque position, y compris aux deux extrémités.

  • Deque: Toute insertion ou suppression d'éléments autre qu'au début ou à la fin invalide tous les pointeurs, références et itérateurs qui font référence aux éléments de la deque.
  • List: L'insertion et la suppression d'éléments n'invalident pas les pointeurs, les références et les itérateurs vers d'autres éléments.

Complexité

             Insert/erase at the beginning       in middle        at the end

Deque:       Amortized constant                  Linear           Amortized constant
List:        Constant                            Constant         Constant
110
aJ.

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.

7
Reed Copsey

Une autre garantie importante est la façon dont chaque conteneur différent stocke ses données en mémoire:

  • Un vecteur est un seul bloc de mémoire contigu.
  • Un deque est un ensemble de blocs de mémoire liés, où plus d'un élément est stocké dans chaque bloc de mémoire.
  • Une liste est un ensemble d'éléments dispersés dans la mémoire, c'est-à-dire: un seul élément est stocké par "bloc" de 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.

4
jose.angel.jimenez

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.

4
Jonathan Graehl

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 ().

2
Lee B