Optimization 有条件地添加到HashMap的最佳方法是使用尽可能少的查找?
使用哈希映射时,如果密钥不存在,通常需要添加Optimization 有条件地添加到HashMap的最佳方法是使用尽可能少的查找?,optimization,hashmap,rust,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); } 虽然这是可行的,但它将始终执行2次查找 我能得到的最接近
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);
}
虽然这是可行的,但它将始终执行2次查找
我能得到的最接近的方法是使用条目。或_insert
(或或_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);
}
是否有更清晰的方法在需要时插入一个值,同时在它确实存在/不存在的情况下保持运行两个逻辑分支的方式?您只需匹配
条目即可:
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);
}
}
谢谢事实上,我想问一个关于这个主题的问题,因为文档目前没有显示如何以这种方式使用条目。我会用PR来添加它!