假设我们有一个结构向量:
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)
这肯定不是最高效的解决方案,因为它创建了一个临时的元组向量,但正如我所说,在这种情况下,我最关心的是方便性和简洁性。那么,还有比这更简单的事情吗?
没有必要收集到Vec两者之间:
let map_names_by_id: HashMap<_, _> =
items.iter().map(|x| (x.id, x.name.clone())).collect();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |