如果我们需要FIFO或LIFO集合(与基本push
,pop
和front
/ back
)我们应该在锈使用?像std::queue
或std::stack
从C++.
Mat*_* M. 24
首先,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
.
小智 7
Matthieu M. 有它几乎完美。 Vec
是您的堆栈 (LIFO),VecDeque
是一个双端队列,支持所有 4 种变体(FIFO、FILO、LIFO 和 LILO),使用:
.push_front(x) | .front() | .pop_front()
.push_back(x) | .back() | .pop_back()
Run Code Online (Sandbox Code Playgroud)
如果您希望最大限度地提高效率,我建议您查看“了解 Rust 的 Vec 及其快速高效程序的能力”。它详细介绍了如何在Vec
and 中进行分配和重新分配VecDeque
,但最大的收获是,如果您可以预测队列中需要的最大元素数,则可以使用,VecDeque::with_capacity(x)
如果您知道何时初始化它,或者.reserve_exact(x)
如果在某个时候您确切地知道您将需要多少个插槽
我强烈建议查看 Rust 文档std::collections
,它有一个极好的 Rust 中最常用集合的列表,以及关于何时选择每个集合的建议
最后一件事,VecDeque
不是 Rust 中默认前奏的一部分,所以如果你想使用它,你需要包括这个:
use std::collections::VecDeque;
Run Code Online (Sandbox Code Playgroud)