2016-09-18 31 views
2

使用散列映射時,如果密鑰不存在,通常需要添加一個key:value對。有條件地添加到HashMap的最佳方式,儘可能少的查找?

這樣讀得不錯,但並不儘可能優化。

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); 
} 

是否有插入值更明確的方式,同時保持運行的邏輯的兩個分支爲它/不存在的情況下的方式在需要的時候?

回答

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); 
    } 
} 
+0

謝謝!事實上,由於文檔目前沒有以這種方式顯示如何使用條目,所以會問這個問題。 – ideasman42

+2

我會帶公關加入它! –

相關問題