如何有效地查找和插入HashMap?

我想要做以下事情:

  • 查找某个关键的Vec ,并将其存储以备后用。
  • 如果不存在,则为该键创build一个空的Vec ,但仍保留在该variables中。

如何有效地做到这一点? 当然,我认为我可以使用match ,但是当我尝试它,它给了我多个错误:

 use std::collections::HashMap; // This code doesn't compile. let mut map = HashMap::new(); let key = "foo"; let values: &Vec<isize> = match map.get(key) { Some(v) => v, None => { let default: Vec<isize> = Vec::new(); map.insert(key, default); &default } }; 

我最终做了这样的事情,但我不喜欢它执行查找两次( map.contains_keymap.get )的事实:

 // This code does compile. let mut map = HashMap::new(); let key = "foo"; if !map.contains_key(key) { let default: Vec<isize> = Vec::new(); map.insert(key, default); } let values: &Vec<isize> = match map.get(key) { Some(v) => v, None => { panic!("impossiburu!"); } }; 

有一个安全的方法来做到这一点只有一场match

entry API是为此而devise的。 在手动forms,它可能看起来像

 use std::collections::hash_map::Entry; let values: &Vec<isize> = match map.entry(key) { Entry::Occupied(o) => o.into_mut(), Entry::Vacant(v) => v.insert(default) }; 

或者可以使用简单的forms:

 map.entry(key).or_insert_with(|| default) 

如果即使未插入, default也可以计算,也可以是:

 map.entry(key).or_insert(default)