2008-09-19 64 views
71

Dado que las únicas operaciones necesarias para un contenedor para ser utilizado en una pila son:¿Por qué std :: stack usa std :: deque de forma predeterminada?

  • atrás()
  • push_back()
  • pop_back()

¿Por qué es el contenedor predeterminado ¿Es un deque en lugar de un vector?

Las reasignaciones Do not deke dan un búfer de elementos antes del frente() para que push_front() sea una operación eficiente? ¿No se desperdician estos elementos ya que nunca se usarán en el contexto de una pila?

Si no hay sobrecarga para usar un deque de esta forma en lugar de un vector, ¿por qué el valor predeterminado para priority_queue es un vector y no un deque también? (Priority_queue requiere frontal(), push_back(), y pop_back() - esencialmente el mismo que el de pila)


actualiza basándose en las respuestas a continuación:

Parece que la forma deque es generalmente implementado es una matriz de tamaño variable de matrices de tamaño fijo. Esto hace que crezca más rápido que un vector (que requiere reasignación y copia), por lo que para algo así como una pila que se trata de agregar y eliminar elementos, deque es probablemente una mejor opción.

prioridad_queue requiere mucha indexación, ya que cada eliminación e inserción requiere ejecutar pop_heap() o push_heap(). Esto probablemente hace que el vector sea una mejor opción allí ya que agregar un elemento todavía se amortiza de todos modos.

+1

El razonamiento en su 'actualización' no es del todo correcto. el vector normalmente agrega y elimina elementos del extremo _faster_ que deque. deque es más rápido para _crear memoria_, no para empujar elementos. –

Respuesta

64

A medida que el contenedor crece, una reasignación para un vector requiere copiar todos los elementos en el nuevo bloque de memoria. Growing aque asigna un nuevo bloque y lo vincula a la lista de bloques; no se requieren copias.

Por supuesto, puede especificar que se use un contenedor de respaldo diferente si lo desea. Entonces, si tienes una pila que sabes que no va a crecer mucho, dile que use un vector en lugar de una deque si esa es tu preferencia.

12

Consulte Herb Sutter's Guru of the Week 54 por los méritos relativos de vector y deque donde cualquiera de ellos haría.

Imagino que la incoherencia entre priority_queue y queue es simplemente que diferentes personas las implementaron.

+1

prioridad_cola no usa push/pop_front, y las referencias a elementos además del primero son invalidadas por las operaciones de montón. Por lo tanto, ninguno de los beneficios de deque se aplicaría, a diferencia del caso de una cola normal. – Potatoswatter

+7

Además, 'priority_queue' debe permanecer ordenado, por lo que la mayor sobrecarga de acceder aleatoriamente a' deque :: iterator' es más problemática. – Potatoswatter

+0

@Potatoswatter: 'priority_queue' tiene una" orden mágica "que se mantiene, no está ordenada. Sin embargo, tu punto es válido. –

Cuestiones relacionadas