9

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");

有序映射是一个BTreeMap.

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

4

1 回答 1

12

此类型没有最大或最小成员方法(继承或来自 trait)。

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

let map: BTreeSet<V> = ...;
let min = map.iter().next();
let max = map.iter().next_back();

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

// This will be very slow
map.iter().max()
map.iter().min()

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

test bench_first ... bench:           9 ns/iter (+/- 0)
test bench_last  ... bench:           8 ns/iter (+/- 0)
test bench_max   ... bench:       3,603 ns/iter (+/- 536)
test bench_min   ... bench:       3,755 ns/iter (+/- 328)
于 2019-11-20T09:36:06.260 回答