如何获取有序集/有序映射的最大值和最小值?

Jer*_*hoy 5 b-tree rust ordered-map ordered-set

Rust 的有序集是一个BTreeSet

use std::collections::BTreeSet;

// Type inference lets us omit an explicit type signature (which
// would be `BTreeSet<&str>` in this example).
let mut books = BTreeSet::new();

// Add some books.
books.insert("A Dance With Dragons");
books.insert("To Kill a Mockingbird");
books.insert("The Odyssey");
books.insert("The Great Gatsby");
Run Code Online (Sandbox Code Playgroud)

有序映射是一个BTreeMap.

由于 set 和 map 是有序的,因此应该有一种方法可以获取包含的最大和最小元素。你怎么得到它们?

Jer*_*hoy 10

这种类型没有最大或最小成员方法(固有的或来自特征的)。

在 O(log(n)) 中访问此信息的最佳方法是直接使用迭代器,正如开发团队在GitHub 的 issue 31690 中提到的:

let map: BTreeSet<V> = ...;
let min = map.iter().next();
let max = map.iter().next_back();
Run Code Online (Sandbox Code Playgroud)

您可以使用Iterator::max()Iterator::min()方法获取集合的最大值和最小值,但使用有序集合执行此操作将浏览整个集合,忽略我们从订单中获得的信息。

// This will be very slow
map.iter().max()
map.iter().min()
Run Code Online (Sandbox Code Playgroud)

问题 59947 有一个基准,显示了以下两种选择BTreeMap

// This will be very slow
map.iter().max()
map.iter().min()
Run Code Online (Sandbox Code Playgroud)