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 枚举,它有两个变体:Occupied 和 Vacant

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 的键必须实现 Eq 和 Hash trait,因为 HashMap 需要根据键的哈希值来存储和查找值。

默认情况下,Rust 的标准库类型如 String、i32 等已经实现了这些 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
相关推荐
敬往事一杯酒哈5 小时前
海康 AGV 导航读码器学习
学习
qq_284274057 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
qq_284274058 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
Titan20249 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
小雪崩10 小时前
嵌入式学习 day64:字符设备驱动
学习
深圳老胡10 小时前
STM32CubeMX 生成 CMake 工程,用 VSCode 编译与调试的完整流程
笔记·stm32·单片机·代码规范
个 人 练 习 生10 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
坤坤子吖10 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
乐橙开放平台11 小时前
智慧连锁客流检测和离岗检测怎么对接
大数据·人工智能·笔记·物联网·自动化·音视频·智能家居
零基础12311 小时前
FinalShell 使用教程:从安装到高效运维
运维·经验分享·笔记·finalshell