代码之家  ›  专栏  ›  技术社区  ›  at54321

从向量场创建HashMap的最有效方法

  •  1
  • at54321  · 技术社区  · 5 年前

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

    struct Item {
        id: u32,
        name: String,
        // ...
    }
    
    let mut items: Vec<Item> = vec!(
        Item { id: 54, name: "Foo".into() },
        Item { id: 87, name: "Bar".into() });
    

    创建如下哈希图的最有效方法是什么:

    {87: "Bar", 54: "Foo"}
    

    ?

    在这种情况下,我所说的“高效”主要是指“不那么冗长”。为什么?因为我感觉 最 在现实世界中,轻微的性能惩罚其实并不重要。但当它 做 这件事,人们总是可以求助于 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();
    

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

    1 回复  |  直到 5 年前
        1
  •  5
  •   orlp    5 年前

    没有必要收集到 Vec 介于以下两者之间:

    let map_names_by_id: HashMap<_, _> =
        items.iter().map(|x| (x.id, x.name.clone())).collect();
    
    推荐文章