【Rust自学】8.5. HashMap Pt.1:HashMap的定义、创建、合并与访问
8.5 HashMap Pt.1HashMap的定义、创建、合并与访问8.5.0. 本章内容第八章主要讲的是 Rust 中常见的集合。Rust 提供了很多集合类型的数据结构这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。第八章中的集合是存储在堆内存上而非栈内存上的这也意味着这些集合的数据大小无需在编译时就确定在运行时它们可以动态地变大或变小。本章主要会讲三种集合Vector、String 和HashMap本文。8.5.1. 什么是 HashMapHashMap的形式是HashMapK, V其中K代表键keyV代表值value。HashMap以键值对的形式存储数据一个键对应一个值。很多语言都支持这样的集合数据结构但叫法不一定相同——例如 C# 中相同概念的数据结构叫字典dictionary。HashMap的内部实现使用了哈希函数这个函数决定了如何在内存中存储键与值。在Vector中我们使用索引来访问数据但有的时候你想通过键来查找数据键可以是任何实现了Eq和Hashtrait 的类型而不是通过索引或者说你不清楚这个数据在哪个索引上。这种情况就可以使用HashMap。需要注意的是HashMap是同构的也就是说在一个HashMap中所有的键必须是同一类型所有的值必须是同一类型。8.5.2. 创建 HashMap由于HashMap不常用所以 Rust 并没有把它放进预导入模块prelude。使用前需要引入HashMap在文件开头写上use std::collections::HashMap;创建空的HashMap使用HashMap::new()函数添加数据使用insert()方法看个例子use std::collections::HashMap; fn main() { let mut scores: HashMapString, i32 HashMap::new(); }在这里创建了一个名为scores的变量来存储HashMap。由于 Rust 是强类型语言它必须知道你在HashMap里存储什么数据类型。又因为没有前后文可供编译器推断所以在声明时就必须把键和值的数据类型显式声明出来。在这段代码中scores的键被设为String值被设为i32。当然如果你在后文给这个HashMap添加了数据Rust 就会根据插入的数据自动推断键和值的数据类型。添加数据使用insert()方法。例子如下use std::collections::HashMap; fn main() { let mut scores HashMap::new(); scores.insert(String::from(dev1ce), 0); }因为在第 5 行往scores里插入了键值对且键String::from(dev1ce)是String类型值0是i32Rust 默认整数类型是i32所以编译器就会推断出scores是一个HashMapString, i32因此第四行在声明时就不需要显式声明类型了。8.5.3. 将两个 Vector 合为一个 HashMap在元素类型为元组的Vector上可以使用collect方法来构建HashMap。换个说法假如你有两个Vector这两个Vector上的所有值都有一一对应关系就可以使用collect把一个Vector里的数据作为键另一个作为值放到HashMap里。如下例use std::collections::HashMap; fn main() { let player vec![String::from(dev1ce), String::from(Zywoo)]; let initial_scores vec![0, 100]; let scores: HashMap_, _ player.into_iter().zip(initial_scores).collect(); }player这个Vector用来存储选手名字里面的元素是String类型。initial_scores这个Vector用来存储每个选手对应的得分。player.into_iter()以及传给zip的initial_scores也会变成迭代器会从这两个Vector中取出拥有所有权的值。使用.zip()可以创建“player中元素在前、initial_scores中元素在后”的元组序列。如果想交换元素位置把代码中的两个迭代器互换位置即可。然后再使用.collect()把这些元组转换成HashMap。因为使用了into_iterHashMap会获得这些值的所有权原来的两个Vector会被消耗掉。最后要注意的一点是.collect()支持转换为很多数据结构。如果写代码时不显式声明其类型程序就会报错。这里指明了类型是HashMap_, _。中的两个数据类型编译器可以根据代码也就是两个Vector的类型来推断所以这里可以写_占位符让它自行推断。8.5.4. HashMap 和所有权对于实现了Copytrait 的数据类型例如i32以及绝大多数简单数据类型值会被复制到HashMap中原先的变量仍然可用。对于没有实现Copy的类型例如String所有权会被移交给HashMap。如果将引用插入到HashMap值本身就不会移动。在HashMap的有效期间被引用的值必须保持有效。8.5.5. 访问 HashMap 中的值访问值可以使用get方法。get方法的参数是HashMap的键返回值是OptionV枚举。看个例子use std::collections::HashMap; fn main() { let mut scores HashMap::new(); scores.insert(String::from(dev1ce), 0); scores.insert(String::from(Zywoo), 100); let player_name String::from(dev1ce); let score scores.get(player_name); match score { Some(score) println!({}, score), None println!(Player not found), }; }首先创建了一个空的HashMap叫做scores然后通过insert往里面添加了两个键值对(dev1ce, 0)和(Zywoo, 100)键类型是String值类型是i32。然后声明了名为player_name的String变量其值为dev1ce。接着通过HashMap上的get方法在scores中查找player_name这个键所对应的值表示引用。但由于get返回的是Option枚举所以这里先把这个Option值赋给score后面再来解包。最后使用match表达式来处理score。如果找到了对应的值score就是Some变体把Some关联的值绑定到score上然后再打印出来。如果找不到score就是None变体这时就会打印Player not found。输出08.5.6. 遍历 HashMap遍历HashMap一般使用for循环。如下例use std::collections::HashMap; fn main() { let mut scores HashMap::new(); scores.insert(String::from(dev1ce), 0); scores.insert(String::from(Zywoo), 100); for (k, v) in scores { println!({}: {}, k, v); } }这个for循环使用的是HashMap的引用也就是scores因为通常遍历之后还要继续使用这个HashMap所以使用引用就不会失去所有权。前面的(k, v)是模式匹配第一个值是键赋给k第二个是值赋给v。一种可能的输出如下遍历顺序是任意的不同运行之间可能不同dev1ce: 0 Zywoo: 100

相关新闻

腺相关病毒载体构建伯远生物腺相关病毒载体

腺相关病毒载体构建伯远生物腺相关病毒载体

腺相关病毒载体构建伯远生物腺相关病毒载体 伯远生物是国家级专精特新小巨人企业,国家级重点实验室,牵头多项省部级重大专项,公司科研技术人员500(硕博占比40%以上),作为功能基因研究综合性平台&#xff0c…

2026/10/12 14:32:54 阅读更多 →
办公自动化专用 OpenClaw 部署教程,内置全套运行组件(含安装包)

办公自动化专用 OpenClaw 部署教程,内置全套运行组件(含安装包)

Windows 平台 OpenClaw 部署实操|短时搭建本地 AI 智能体,简化环境配置流程 内容核心 图形化操作界面|自动化环境适配|内置完整运行组件|28 万 Tokens 资源额度|多系统兼容适配 适配版本:Open…

2026/10/17 0:38:02 阅读更多 →
V100 32G 全参数训练完整说明

V100 32G 全参数训练完整说明

先讲核心结论:V100 32G 几乎无法做主流大模型全参数训练,仅能极小参数量模型裸训;7B/13B/30B 只能 LoRA 微调,不能全量训练 一、基础概念区分 全参数训练(全量训练) 冻结任何层,模型所有权重、梯度、优化器参数全部存入显存,显存占用极高。 LoRA 微调 冻结基座大模型,…

2026/10/17 9:09:03 阅读更多 →

最新新闻

Stable Diffusion跨注意力图实现零样本图像分割的方法与实践

Stable Diffusion跨注意力图实现零样本图像分割的方法与实践

1. 这个思路是怎么来的:当扩散模型撞上分割任务1.1 为什么说AI看图会“瞎猜”:从三个真实痛点说起图像分割在计算机视觉里一直是个很微妙的工作。检测是告诉你“这里有个盒子”,分割是告诉你“这个盒子的边界到底在哪”。前者是粗活&#xff…

2026/10/18 10:10:40 阅读更多 →
Spark性能调优实战:从RDD、Shuffle到数据倾斜全解

Spark性能调优实战:从RDD、Shuffle到数据倾斜全解

Apache Spark 这几年在大数据计算里几乎成了标配。做日志清洗用它,跑离线报表用它,搞实时特征也离不开它。我在实际项目里用它处理过几十TB的日志数据,也帮同事排查过各种 OOM 和任务卡死的问题。很多人觉得 Spark 上手容易,无非是…

2026/10/18 10:10:40 阅读更多 →
Apache Spark核心机制与PySpark实战:从DAG调度到性能调优

Apache Spark核心机制与PySpark实战:从DAG调度到性能调优

手头又攒了一轮粉丝留言,最多的一个就是"能不能出一篇Apache Spark的完整教程"。说实话,Spark这个框架在数据工程圈子里几乎是默认的标配技能,不管是离线报表、实时数仓,还是机器学习特征工程,十有八九都会落…

2026/10/18 10:10:40 阅读更多 →
货运SaaS多租户架构设计与核心模块源码解析

货运SaaS多租户架构设计与核心模块源码解析

货运行业做SaaS,和做普通企业管理系统最大的区别在哪里?我先把话说在前面:不是功能堆得多,而是架构扛得住。一套系统要同时服务几十上百家物流公司,每家公司看到的都是自己的订单、自己的司机、自己的账单,…

2026/10/18 10:10:40 阅读更多 →
FDOA定位中的GDOP:布站几何如何决定定位精度?

FDOA定位中的GDOP:布站几何如何决定定位精度?

简介:面向无线定位与信号处理方向研究者的 MATLAB 实现,围绕 FDOA(到达频率差)定位中的 GDOP(几何精度衰减因子)计算展开。脚本覆盖从 FDOA 测量数据预处理、频差计算、距离估计到接收器几何布局建模、GDOP…

2026/10/18 10:10:40 阅读更多 →
JavaWeb学籍管理系统:Servlet-JSP-JDBC三层实战与答辩通关指南

JavaWeb学籍管理系统:Servlet-JSP-JDBC三层实战与答辩通关指南

简介:本资源是一套完整可用的JavaWeb学籍管理系统课程设计项目,面向计算机专业本科生及Java初学者,用于完成期末大作业、课程设计实践或Web开发入门训练。系统涵盖学生信息管理、班级维护、成绩录入与查询等核心教务功能,采用JSPS…

2026/10/18 10:09:40 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →