web-dev-qa-db-fra.com

Pourquoi STD :: Stack utilise STD :: DEQUE par défaut?

Étant donné que les seules opérations requises pour qu'un conteneur soient utilisées dans une pile soit:

  • arrière()
  • Repousser()
  • pop_back ()

Pourquoi le conteneur par défaut est-il une desques au lieu d'un vecteur?

Ne dentez pas les rétroglocations Donner un tampon d'éléments avant le front () de sorte que le push_front () est une opération efficace? Ces éléments ne sont-ils pas gaspillés car ils ne seront jamais utilisés dans le contexte d'une pile?

S'il n'y a pas de frais générale pour utiliser une orque de cette façon au lieu d'un vecteur, pourquoi la valeur par défaut pour priority_queue est-elle un vecteur non pas une dquet aussi? (priority_queue nécessite avant (), push_back () et pop_back () - essentiellement la même chose que pour la pile)


mis à jour sur la base des réponses ci-dessous :

Il semble que la voie de la route soit généralement implémentée est une matrice de taille variable de matrices de taille fixe. Cela rend la croissance plus rapide qu'un vecteur (qui nécessite une réaffectation et une copie), donc pour quelque chose comme une pile qui consiste à ajouter et à supprimer des éléments, la DEQUE est probablement un meilleur choix.

priority_Queue nécessite une indexation fortement, car chaque retrait et chaque insertion nécessite que vous exécutez POP_HEAP () ou PUSH_HEAP (). Cela rend probablement vecteur un meilleur choix là-bas depuis que l'ajout d'un élément est toujours amorti de toute façon constante.

85
Greg Rogers

Lorsque le conteneur augmente, une réaffectation pour un vecteur nécessite de copier tous les éléments dans le nouveau bloc de mémoire. La croissance d'une deque alloue un nouveau bloc et la relie à la liste des blocs - aucune copie n'est requise.

Bien sûr, vous pouvez spécifier qu'un conteneur de support différent soit utilisé si vous le souhaitez. Donc, si vous avez une pile que vous savez ne va pas grandir beaucoup, dites-lui d'utiliser un vecteur au lieu d'une dentelle si c'est votre préférence.

72
Michael Burr

Voir Herb Sutter's Guru de la semaine 54 pour les mérites relatives du vecteur et de la dentque où le ferait.

J'imagine que l'incohérence entre priority_queue et la file d'attente est simplement que différentes personnes les ont mis en œuvre.

12
James Hopkin