[英]Are there queue and stack collections in Rust?
如果我们需要 FIFO 或 LIFO 集合(基本上是push
、 pop
和front
/ back
)我们应该在 Rust 中使用什么? 像 C++ 中的std::queue
或std::stack
类的东西。
首先,Rust 不提供(在标准库中)任何有保证添加元素延迟的库:Rust 集合通常会在添加新元素时分配内存,在最坏的情况下分配内存可能需要无限量的时间。
话虽如此,每种情况都有两个竞争者:
Vec
或LinkedList
之上实现(功能pop_back
和push_back
)VecDeque
或LinkedList
之上实现(功能pop_front
和push_back
) Vec*
和LinkedList
之间的区别在于后者很简单:每次调用push_back
分配内存。 一方面,这很好,因为这意味着push_back
的成本与集合中已有的元素数量无关,另一方面……嗯,内存分配可能需要很长时间。
前者稍微复杂一点:
push_back
push_back
一般来说,我建议将Vec
用于堆栈,将VecDeque
用于队列。
无论VecDeque
和LinkedList
有push
/ pop
_ front
/ back
。
Matthieu M. 有它几乎完美。 Vec
是您的堆栈 (LIFO), VecDeque
是一个双端队列,支持所有 4 种变体(FIFO、FILO、LIFO 和 LILO),使用:
.push_front(x) | .front() | .pop_front()
.push_back(x) | .back() | .pop_back()
如果您希望最大限度地提高效率,我建议您查看“了解 Rust 的 Vec 及其快速高效程序的能力” 。 它详细介绍了如何在Vec
和VecDeque
分配和重新分配,但最大的VecDeque
是,如果您可以预测队列中需要的最大元素数,则可以使用VecDeque::with_capacity(x)
如果你知道你什么时候初始化它,或者.reserve_exact(x)
如果在某个时候你确切地知道你需要多少个插槽
我强烈建议查看std::collections
上的 Rust 文档,它有一个极好的 Rust 中最常用集合的列表,以及关于何时选择每个集合的建议
最后一件事, VecDeque
不是 Rust 中默认前奏的一部分,因此如果您想使用它,您需要包含以下内容:
use std::collections::VecDeque;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.