Rust学习笔记_17——HashMap

Rust学习笔记_14------结构体
Rust学习笔记_15------Union
Rust学习笔记_16------Vector


HashMap

文章目录

    • HashMap
      • [1. 创建](#1. 创建)
      • [2. 插入数据](#2. 插入数据)
      • [3. 访问](#3. 访问)
      • [4. 更新](#4. 更新)
      • [5. 遍历](#5. 遍历)
      • [6. 移除](#6. 移除)
      • [7. 注意](#7. 注意)
      • [8. 示例](#8. 示例)

Rust 中的 HashMap 是一种非常有用的数据结构,它允许你存储键值对(key-value pairs),并且可以在常数时间内(O(1) 平均时间复杂度)根据键来查找对应的值。

HashMap 是 Rust 标准库的一部分,位于 std::collections 模块中。

1. 创建

rust 复制代码
// 引入HashMap类型
use std::collections::HashMap;

//创建HashMap实例
let mut map: HashMap<String, i32> = HashMap::new();

2. 插入数据

使用insert方法向HashMap中插入键值对

rust 复制代码
map.insert(String::from("one"), 1);
map.insert(String::from("two"), 2);
map.insert(String::from("three"), 3);

3. 访问

使用 get 方法可以根据键来访问对应的值。

get 方法返回一个 Option<&V> 类型的值,这反映了 Rust 的所有权系统和可能的键不存在的情况

rust 复制代码
let value = map.get(&String::from("one"));
match value {
    Some(v) => println!("Found value: {}", v),
    None => println!("Key not found"),
}

4. 更新

entry方法提供了一种更高效的方式来更新 HashMap 中的值,因为它避免了多次哈希查找。

entry 方法返回一个 Entry 枚举,它有两个变体:OccupiedVacant

rust 复制代码
match map.entry(String::from("one")) {
    Entry::Occupied(e) => {
        e.into_mut().push(1); // 假设值是 Vec<i32> 类型,更新值
    }
    Entry::Vacant(e) => {
        e.insert(1); // 插入新值
    }
}

5. 遍历

使用迭代器来遍历HashMap中的键值对

rust 复制代码
for (key, value) in &map {
    println!("Key: {}, Value: {}", key, value);
}

6. 移除

rust 复制代码
map.remove(&String::from("two"));

7. 注意

HashMap 的键必须实现 EqHash trait,因为 HashMap 需要根据键的哈希值来存储和查找值。

默认情况下,Rust 的标准库类型如 Stringi32 等已经实现了这些 trait。

8. 示例

rust 复制代码
use std::collections::HashMap;

fn main() {
    let mut map: HashMap<String, i32> = HashMap::new();

    // 插入键值对
    map.insert(String::from("one"), 1);
    map.insert(String::from("two"), 2);
    map.insert(String::from("three"), 3);

    // 访问值
    match map.get(&String::from("one")) {
        Some(v) => println!("Found value: {}", v),
        None => println!("Key not found"),
    }

    // 更新值
    map.entry(String::from("two")).or_insert(50); // 如果键不存在,则插入 50
相关推荐
郭涤生1 小时前
Chapter 11: Stream Processing_《Designing Data-Intensive Application》
笔记·分布式
一个真正のman.2 小时前
c加加学习之day01
学习
蔗理苦3 小时前
2025-04-03 Latex学习1——本地配置Latex + VScode环境
ide·vscode·学习·latex
V---scwantop---信5 小时前
现代科幻赛博朋克风品牌海报电子竞技设计无衬线英文字体 Glander – Techno Font
笔记·字体
charlie1145141915 小时前
从0开始的构建的天气预报小时钟(基于STM32F407ZGT6,ESP8266 + SSD1309)——第2章——构建简单的ESP8266驱动
stm32·单片机·物联网·学习·c·esp8266
南宫生5 小时前
Java迭代器【设计模式之迭代器模式】
java·学习·设计模式·kotlin·迭代器模式
虾球xz6 小时前
游戏引擎学习第203天
学习·游戏引擎
WDeLiang6 小时前
Flask学习笔记 - 模板渲染
笔记·学习·flask
明月清了个风7 小时前
数据结构与算法学习笔记----贪心区间问题
笔记·学习·算法·贪心算法
我是前端小学生7 小时前
写给rust开发者:一文了解cargo-deny项目
rust