Saltar al contenido

¿Hay colecciones de colas y pilas en Rust?

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 o LinkedList (ambos cuentan pop_back y push_back)
  • se puede implementar una cola encima de VecDeque o LinkedList (ambos cuentan pop_front y push_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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *