将 HashMap 值转换为 BinaryHeap

Ach*_*113 1 rust

我说的是std::collections::hash_map::Values结构体,它是.values()通过在HashMap. 这个结构真的让我感到困惑,如何在不迭代它们的情况下访问它的值?我想把这些值变成BinaryHeap这样:

let heap = BinaryHeap::from(map.values());
Run Code Online (Sandbox Code Playgroud)

我阅读了文档,似乎这个结构并没有真正访问其元素的简单方法

Nik*_*rin 7

Values结构定义为

HashMap 值的迭代器。

但是,有一种简单的方法可以将值转换为BinaryHeap. 既然它实现了FromIterator,你可以做

let heap: BinaryHeap<_> = map.values().collect();
Run Code Online (Sandbox Code Playgroud)

上面的代码将创建一个BinaryHeap引用。如果您希望堆拥有这些值,您可以像这样将值移出地图:

let heap: BinaryHeap<_> = map.drain().map(|(_key, value)| value).collect();
Run Code Online (Sandbox Code Playgroud)

或克隆值:

let heap: BinaryHeap<_> = map.values().cloned().collect();
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的值类型是Copy(如i32),您可以调用.copied()而不是.cloned(). 这不会加快过程,但它是更准确和更好的做法。

  • 请注意,您可以使用 `.copied()` 而不是 `.cloned()` 来断言克隆是“便宜的”(相当于数据的按位复制)。 (2认同)