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 后可用 `copied()` 或 `cloned()`
  • 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");          // 丢弃并返回 Option<V>
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| /* ... */) 根据谓词保留部分元素。