繁体   English   中英

Rust 中有队列和堆栈集合吗?

[英]Are there queue and stack collections in Rust?

如果我们需要 FIFO 或 LIFO 集合(基本上是pushpopfront / back )我们应该在 Rust 中使用什么? 像 C++ 中的std::queuestd::stack类的东西。

首先,Rust 不提供(在标准库中)任何有保证添加元素延迟的库:Rust 集合通常会在添加新元素时分配内存,在最坏的情况下分配内存可能需要无限量的时间。

话虽如此,每种情况都有两个竞争者:

  • 堆栈可以在VecLinkedList之上实现(功能pop_backpush_back
  • 队列可以在VecDequeLinkedList之上实现(功能pop_frontpush_back

Vec*LinkedList之间的区别在于后者很简单:每次调用push_back分配内存。 一方面,这很好,因为这意味着push_back的成本与集合中已有的元素数量无关,另一方面……嗯,内存分配可能需要很长时间。

前者稍微复杂一点:

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

一般来说,我建议将Vec用于堆栈,将VecDeque用于队列。

无论VecDequeLinkedListpush / 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 及其快速高效程序的能力” 它详细介绍了如何在VecVecDeque分配和重新分配,但最大的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM