Hacemos una verificación completa cada reseñas en nuestro espacio con el objetivo de mostrarte en todo momento información con la mayor veracidad y certera.
Solución:
En primer lugar, Rust no ofrece (en la biblioteca estándar) ninguna biblioteca con latencia garantizada para agregando elementos: las colecciones de Rust generalmente pueden asignar memoria al agregar nuevos elementos, y la asignación de memoria puede llevar una cantidad ilimitada de tiempo en el peor de los casos.
Dicho esto, hay dos contendientes para cada caso:
- se puede implementar una pila encima de
Vec
oLinkedList
(ambos cuentanpop_back
ypush_back
) - se puede implementar una cola encima de
VecDeque
oLinkedList
(ambos cuentanpop_front
ypush_back
)
La diferencia entre Vec*
y LinkedList
es que este último es simplista: para cada llamada a push_back
se realiza una asignación de memoria. Por un lado, esto es genial porque significa que el costo de push_back
es independiente de la cantidad de elementos que ya están en la colección, por otro lado … bueno, una asignación de memoria puede llevar mucho tiempo.
El primero es un poco más complicado:
- tiene un mejor rendimiento, gracias a ser más amigable con el caché
- tiene capacidad adicional, garantizando no asignar
push_back
siempre que haya exceso de capacidad - todavía mantiene amortizado O (1)
push_back
incluso cuando no se reserva el exceso de capacidad con anticipación
En general, aconsejaría usar Vec
para una pila y VecDeque
para una cola.
Ambos VecDeque
y LinkedList
tener push
/pop
_front
/back
.
Matthieu M. lo tiene casi perfecto. Vec
es su pila (LIFO) y VecDeque
es una cola de dos extremos que admite las 4 variantes (FIFO, FILO, LIFO y LILO) utilizando:
.push_front(x) | .front() | .pop_front()
.push_back(x) | .back() | .pop_back()
Si está buscando maximizar su eficiencia, le recomiendo que consulte “Entender el Vec de Rust y su capacidad para programas rápidos y eficientes”. Entra en muchos más detalles sobre cómo se produce la asignación y la reasignación en Vec
y VecDeque
, pero lo más importante es que si puede predecir la cantidad máxima de elementos que necesitará en la cola, puede usar VecDeque::with_capacity(x)
si sabe cuándo lo inicializa, o .reserve_exact(x)
si en algún momento sabes exactamente cuántos más ranuras que vas a necesitar
Recomiendo encarecidamente consultar los documentos de Rust en std::collections
, tiene una lista excelente de las colecciones más comunes utilizadas en Rust, junto con sugerencias sobre cuándo elegir cada una
Una última cosa, VecDeque
no es parte del preludio predeterminado en Rust, por lo que si desea usarlo, debe incluir esto:
use std::collections::VecDeque;
Puntuaciones y reseñas
Puedes añadir valor a nuestro contenido informacional dando tu experiencia en las referencias.