Rust中是否存在队列和堆栈集合?

Rust中是否存在队列和堆栈集合?,rust,Rust,如果我们需要先进先出或后进先出(基本上是push,pop和front/back),我们应该在Rust中使用什么?类似于 STD::队列< 或代码> STD::Suth< > C++ > < P>两个,并有推/ < >代码> POP< /COD> >代码>前面< /代码> />代码> Buffe> < /P> < P>首先,Rust不提供(标准库)任何具有添加元素保证延迟的库:Rust collections通常在添加新元素时分配内存,在最坏的情况下分配内存可能需要无限的时间 也就是说,每个案

如果我们需要先进先出或后进先出(基本上是
push
pop
front
/
back
),我们应该在Rust中使用什么?类似于<代码> STD::队列< <代码>或代码> STD::Suth< <代码> > C++ >

< P>两个,并有<代码>推/ < >代码> POP< /COD> >代码>前面< /代码> />代码> Buffe> < /P> < P>首先,Rust不提供(标准库)任何具有添加元素保证延迟的库:Rust collections通常在添加新元素时分配内存,在最坏的情况下分配内存可能需要无限的时间

也就是说,每个案例都有两个竞争者:

  • 堆栈可以在
    Vec
    LinkedList
    的顶部实现(功能
    pop\u back
    push\u back
  • 队列可以在
    VecDeque
    LinkedList
    之上实现(功能
    pop\u front
    push\u back
Vec*
LinkedList
之间的区别在于后者过于简单:对
push_back
的每次调用都会进行内存分配。一方面,这很好,因为这意味着
push_back
的成本与集合中已有的元素数量无关,另一方面。。。嗯,内存分配可能需要很长时间

前者稍微复杂一些:

  • 由于缓存更友好,它具有更好的吞吐量
  • 它有额外的容量,只要有多余的容量,就可以保证不分配
    push_back
  • 即使在没有提前预留过剩产能的情况下,它仍然保持摊销O(1)
    push_back

一般来说,我建议对堆栈使用
Vec
,对队列使用
VecDeque

Matthieu M.几乎完美无瑕。是您的堆栈(LIFO),是一个双端队列,支持所有4种变体(FIFO、FILO、LIFO和LILO),使用:

.push_front(x)|.front()|.pop_front()
.向后推(x)|向后推(x)|向后
如果你想最大限度地提高效率,我建议你退房。它详细介绍了如何在
Vec
VecDeque
中进行分配和再分配,但最大的收获是,如果您可以预测队列中需要的最大元素数,您可以使用
VecDeque::with_capacity(x)
,如果您知道何时初始化它,或者
。保留\u精确(x)
,如果在某个时刻您确切地知道您将需要多少插槽

我强烈建议您查看上的Rust文档,它列出了Rust中使用的最常见的收藏,并提供了关于何时挑选每一个的建议

最后一件事,
VecDeque
不是Rust中默认前奏曲的一部分,因此如果您想使用它,您需要包括以下内容:

use std::collections::VecDeque;

嗯,谢谢,我搜索了神奇的关键字
FIFO
LIFO
,但没有发现任何重要信息。也许这是一个文档问题。我看到std::Vec对于堆栈来说是一个不错的选择,但是对于队列来说什么更有效呢?这取决于您的用例。我想,
LinkedList
会更容易预测,但是
VecDeque
在某些方面平均效率更高,但实际上你必须自己测量它。@Boiethios:使用前面提到的
VecDeque
来处理队列
LinkedList
在前面是O(1),但在后面不是,因此它更适合用于堆栈。
LinkedList
是一个非常糟糕的堆栈,
Vec
几乎总是更快。
LinkedList
VecDeque
作为队列也一样。难道
VecDeque
也不能用作堆栈吗?@Nulik:根据“谁能最多,谁能最少”的法则,是的。但是,由于
VecDeque
支持附加功能,因此它不像
Vec
那样精巧,当用作
Vec
时,可能会导致性能开销,因此我的建议是。