如何获取 BTreeMap 中的最后一项?

问题描述 投票:0回答:3

如果您有键/值对(或只是键)的排序映射,一个明显的操作是获取第一对或最后一对(或键)。

C++ 的

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()
是一个合理的选择吗?

rust b-tree
3个回答
18
投票

btree_map::Iter
,由
BTreeMap::iter()
返回,实现了
DoubleEndedIterator
,所以确实,使用
rev()
的方法可行,或者 您可以直接使用
next_back()
方法

let (key, value) = map.iter().next_back().unwrap();

2
投票

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 也一样。


1
投票

Iterator::rev
方法要求
Self
实现
DoubleEndedIterator
,因此它应该始终是您的用例的优化和正确选择。

fn rev(self) -> Rev<Self>
where
    Self: DoubleEndedIterator,
© www.soinside.com 2019 - 2024. All rights reserved.