有条件地添加到HashMap的最佳方法是尽可能少的查找?

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)

  • 我会采取公关来添加它! (2认同)