Rust 中的 std::collections::HashMap 等价于其他语言里的 unordered_map,键值类型必须满足 Eq + Hash.
接下来提及一些常用的操作:
创建与插入
1 2 3 4 5
| use std::collections::HashMap;
let mut map = HashMap::new(); map.insert("apple", 3); map.insert("banana", 2);
|
访问元素
1 2 3 4 5
| if let Some(&count) = map.get("apple") { println!("there are {} apples", count); }
let count = map.get("pear").copied().unwrap_or(0);
|
get() 返 Option<&V>;只有借用不占有。
get_mut() 返 Option<&mut V>,可用于就地修改。
修改与默认值
1 2 3 4 5
| *map.entry("orange").or_insert(1) += 1;
map.entry("apple").and_modify(|e| *e += 1);
|
entry API 是 HashMap 的核心
or_insert, or_insert_with
and_modify
or_default, or_insert_with_key
它解决了“如果不存在就插入,再拿到一个可变引用”的常见模式。
删除与清空
1 2 3
| map.remove("banana"); map.clear(); let has = map.contains_key("apple");
|
遍历
1 2 3 4
| for (k, v) in &map { } for (k, v) in &mut map { } for k in map.keys() { } for v in map.values() { }
|
还可以配合 filter, map, collect
collect::<HashMap<_,_>>() 可从迭代器构建。
map.extend(other_iter) 添加多个条目。
map.drain() 移除并迭代所有内容。
map.retain(|k, v| /* ... */) 根据谓词保留部分元素。