ide*_*n42 3 optimization hashmap rust
使用哈希映射时,key:value如果密钥尚不存在,则通常需要添加一对.
这读得不错,但不是最佳.
if !map.contains(key) {
let val = create_val();
map.insert(key, val);
some_creation_logic(val);
} else {
let val = map[key];
some_update_logic(val);
}
Run Code Online (Sandbox Code Playgroud)
虽然这可行,但它总是会进行2次查找.
我最接近的是使用Entry.or_insert(或or_insert_with),计算长度,以便else可以采取分支.
let map_len_prev = map.len();
let val = map.or_insert_with(key, create_val);
if map_len_prev != map.len() {
some_creation_logic(val);
} else {
some_update_logic(val);
}
Run Code Online (Sandbox Code Playgroud)
是否有更清晰的方法在需要时插入一个值,同时保持一种运行两个逻辑分支的方式来处理/不存在的情况?
mca*_*ton 11
你可以匹配Entry:
use std::collections::hash_map::Entry::{Occupied, Vacant};
match map.entry(key) {
Occupied(val) => {
some_update_logic(val.get());
},
Vacant(entry) => {
let val = entry.insert(create_val());
some_creation_logic(val);
}
}
Run Code Online (Sandbox Code Playgroud)