Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are there queue and stack collections in Rust?

Tags:

rust

If we need FIFO or LIFO collections (with basically push, pop and front/back) what should we use in Rust? Something like std::queue or std::stack from C++.

like image 580
Boiethios Avatar asked Nov 28 '16 16:11

Boiethios


People also ask

Does rust have stacks?

Stack in Rust To create a new stack, we can use the following syntax. Copy let s = Stack { stack: Vec::new() };

What are queues in Rust?

queues provides a number of efficient FIFO Queue data structures for usage in your libraries. These are all implemented on top of rust's Vector type. A queue is a linear data structure that commonly defines three methods: add : Also called queue or push , this adds elements to the queue.

How does rust queue work?

Rust queue is a data structure that is used to store the elements, queue in Rust works in an FIO manner that means first in first out. This is a standard queue that is available inside the rust collection library and the queue is a linear data structure.


1 Answers

First of all, Rust does not offer (in the Standard library) any library with guaranteed latency for adding elements: Rust collections may generally allocate memory when adding new elements, and allocating memory may take an unbounded amount of time in the worst case.

That being said, there are two contenders for each case:

  • a stack may be implemented either on top of Vec or LinkedList (both feature pop_back and push_back)
  • a queue may be implemented either on top of VecDeque or LinkedList (both feature pop_front and push_back)

The difference between Vec* and LinkedList is that the latter is simplistic: for each call to push_back a memory allocation is made. On the one hand, this is great because it means that the cost of push_back is independent of the number of elements already in the collection, on the other hand... well, a memory allocation may take a really long time.

The former is a bit more complicated:

  • it has better throughput, thanks to being more cache-friendly
  • it has additional capacity, guaranteeing non-allocating push_back as long as there is excess capacity
  • it still maintains amortized O(1) push_back even when not reserving excess capacity ahead of time

In general, I would advise to use Vec for a stack and VecDeque for a queue.

like image 140
Matthieu M. Avatar answered Oct 11 '22 03:10

Matthieu M.