有条件地添加到HashMap的最佳方式,查找次数尽可能少



在使用哈希映射时,如果密钥不存在,通常希望添加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次查找。

我能得到的最接近的是使用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);
}

是否有一种更清晰的方法来插入一个值,当需要的时候,同时保持一种方式来运行逻辑的两个分支的情况下,它不存在/不存在?

你可以直接匹配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);
    }
}

最新更新