Dado que las únicas operaciones necesarias para que un contenedor se utilice en una pila son:
- espalda()
- hacer retroceder()
- pop_back ()
¿Por qué el contenedor predeterminado es un deque en lugar de un vector?
¿No deque las reasignaciones dan un búfer de elementos antes de front () para que push_front () sea una operación eficiente? ¿No se desperdician estos elementos ya que nunca se utilizarán en el contexto de una pila?
Si no hay sobrecarga para usar una deque de esta manera en lugar de un vector, ¿por qué el valor predeterminado de priority_queue es un vector y no una deque también? (priority_queue requiere front (), push_back () y pop_back (), esencialmente lo mismo que para la pila)
Actualizado según las respuestas a continuación:
Parece que la forma en que deque se implementa generalmente es una matriz de tamaño variable de matrices de tamaño fijo. Esto hace que el crecimiento sea más rápido que un vector (que requiere reasignación y copia), por lo que para algo como una pila que se trata de agregar y eliminar elementos, deque es probablemente una mejor opción.
Priority_queue requiere una indexación en gran medida, ya que cada eliminación e inserción requiere que ejecute pop_heap () o push_heap (). Esto probablemente hace que el vector sea una mejor opción allí, ya que agregar un elemento aún se amortiza como constante de todos modos.
fuente
Respuestas:
A medida que el contenedor crece, la reasignación de un vector requiere copiar todos los elementos en el nuevo bloque de memoria. Hacer crecer un deque asigna un nuevo bloque y lo vincula a la lista de bloques; no se requieren copias.
Por supuesto, puede especificar que se utilice un contenedor de respaldo diferente si lo desea. Entonces, si tiene una pila que sabe que no crecerá mucho, dígale que use un vector en lugar de una deque si esa es su preferencia.
fuente
std::deque
lo que esstd::vector
, y es probable que estas operaciones se utilicen con mucha más frecuencia que las reasignaciones. Me cuesta creer questd::deque
alguna vez superestd::vector
en la práctica.list
, por quédeque
?std::deque
que tiene la oportunidad de ganarstd::vector
en la práctica, o quiere decir que todavía lo duda? Gracias.std::deque
tan bien comostd::vector
en aplicaciones prácticas. Pero por lo que vale, mi experiencia personal es que necesito estructuras de datos de pila y cola no para una tarea grande y de complejidad crucial, sino para muchas pequeñas ocasiones distribuidas en mi código. Como tal, me preocupo más por el comportamiento en los pequeños que en los grandes; y deque brilla particularmente apagado allí. Mi preferencia es no usar ninguna de las dos, sino listas de enlaces individuales (autoimplementadas). Pero su kilometraje puede variar.Consulte el Gurú de la semana 54 de Herb Sutter para conocer los méritos relativos de vector y deque donde cualquiera serviría.
Imagino que la inconsistencia entre priority_queue y queue es simplemente que diferentes personas los implementaron.
fuente
priority_queue
debe permanecer ordenado, por lo que la mayor sobrecarga de acceso aleatoriodeque::iterator
es más problemática.priority_queue
tiene un "orden mágico" que se mantiene, no está ordenado. Sin embargo, su punto se mantiene.