如果您有键/值对(或只是键)的排序映射,一个明显的操作是获取第一对或最后一对(或键)。
std::vector
有 front()
和 back()
用于此目的。 std::map
没有,但是 *map.begin()
和 *map.rbegin()
(反向迭代器)为此工作(假设知道地图不为空)。
在 Rust 中,获取地图的第一个元素似乎需要
map.iter().next().unwrap()
— 丑陋,但考虑到需要进行一些错误检查,这也许是合理的。
我们怎样才能得到最后一个元素?通过跨过所有元素:
map.iter().last().unwrap()
?
Iterator::rev()
,所以map.iter().rev().next().unwrap()
是一个合理的选择吗?
btree_map::Iter
,由 BTreeMap::iter()
返回,实现了 DoubleEndedIterator
,所以确实,使用 rev()
的方法可行,或者 您可以直接使用 next_back()
方法:
let (key, value) = map.iter().next_back().unwrap();
https://github.com/rust-lang/rust/issues/31690#issuecomment-184445033
专用方法可以提高可发现性,但您可以这样做:
let map: BTreeMap<K, V> = ...;
let min = map.iter().next();
let max = map.iter().next_back();
BTreeSet 也一样。
Iterator::rev
方法要求 Self
实现 DoubleEndedIterator
,因此它应该始终是您的用例的优化和正确选择。
fn rev(self) -> Rev<Self>
where
Self: DoubleEndedIterator,