从 Vector 字段创建 HashMap 的最有效方法

at5*_*321 1 rust

假设我们有一个结构向量:

struct Item {
    id: u32,
    name: String,
    // ...
}

let mut items: Vec<Item> = vec!(
    Item { id: 54, name: "Foo".into() },
    Item { id: 87, name: "Bar".into() });
Run Code Online (Sandbox Code Playgroud)

创建如下所示的 HashMap 的最有效方法是什么:

{87: "Bar", 54: "Foo"}
Run Code Online (Sandbox Code Playgroud)

?

通过“高效”,在这种情况下,我主要是指“不那么冗长”。为什么?因为我觉得在大多数实际情况下,轻微的性能损失并不重要。但当它确实重要时,人们总是可以诉诸于HashMap::with_capacity()一个简单的循环,例如。尽管如此,在其他条件相同的情况下,我当然更喜欢速度更快且使用更少内存的解决方案。

我能想到的最简单的事情是:

let temp_tuples = items.iter().map(|x| (x.id, x.name.clone())).collect::<Vec<_>>();
let map_names_by_id: HashMap<_, _> = temp_tuples.into_iter().collect();
Run Code Online (Sandbox Code Playgroud)

这肯定不是最高效的解决方案,因为它创建了一个临时的元组向量,但正如我所说,在这种情况下,我最关心的是方便性和简洁性。那么,还有比这更简单的事情吗?

orl*_*rlp 5

没有必要收集到Vec两者之间:

let map_names_by_id: HashMap<_, _> =
    items.iter().map(|x| (x.id, x.name.clone())).collect();
Run Code Online (Sandbox Code Playgroud)