如何有效地查找和插入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_key
和map.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)