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来添加它!