【Rust自学】8.6. HashMap Pt.2:更新HashMap
8.6.0. 本章内容
第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。
第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编译时就确定,在运行时它们可以动态地变大或变小。
本章主要会讲三种集合:Vector、String和HashMap(本文)
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
8.6.1. 更新HashMap
HashMap的大小可变指的是其中的键值对数量可变,但是在每个时刻一个键只能对应一个值,当想要更新HashMap中的数据的时候,可能有这么几种情况:
-
想要更新的键在HashMap中已经存在一个对应的值:
- 用新的值代替现有的值
- 保留现有的值,忽略新的值
- 合并现有的值和新的值,也就是说对现有的值进行修改
-
键不存在:添加一对键和值
1. 替换(覆盖)现有的值
如果向HashMap插入一对键值对,但键已经存在,程序就会把新值赋给这个键,原来的就被覆盖了。如下例:
use std::collections::HashMap; fn main() { let mut scores = HashMap::new(); scores.insert(String::from("dev1ce"), 0); scores.insert(String::from("dev1ce"), 60); println!("{:?}", scores)
}
这里为通一个键赋了两次值,第一次是0,第二次是60,那么第一次的就会被第二次覆盖掉,也就是说,最终"dev1ce"对应的值是60。
输出:
{"dev1ce": 60}
2. 只在键不存在任何值的情况下才插入值
这个情况是最常见的,对于这种情况,首先需要检查原HashMap中是否已经存在这个键,如果不存在再插入新值。
Rust提供了entry这个方法来实现检查原HashMap中是否已经存在这个键的功能。它的参数为键,它的返回值是一个枚举Entry,代表值是否存在。看个例子:
use std::collections::HashMap; fn main() { let mut scores = HashMap::new(); scores.insert(String::from("dev1ce"), 0); let e = scores.entry(String::from("dev1ce")); println!("{:?}", e);
}
这是键已经存在的情况,来看一下输出:
Entry(OccupiedEntry { key: "dev1ce", value: 0, .. })
也就是说,如果键已经存在,那么entry这个方法会返回Entry枚举下的OccupiedEntry这个变体并且关联已经存在的键值对。
那来试一下键不存在的情况。代码如下:
use std::collections::HashMap; fn main() { let mut scores = HashMap::new(); scores.insert(String::from("dev1ce"), 0); let e = scores.entry(String::from("Zywoo")); println!("{:?}", e);
}
输出:
Entry(VacantEntry("Zywoo"))
如果键不存在,那么它会返回Entry枚举下的VacantEntry变体,并且关联这个新的键。
现在有办法检查原HashMap中是否已经存在这个键,那么如何根据是否存在实现插入或不插入值呢?
Rust提供了or_insert方法,其参数是想要添加的值,它可以接收Entry枚举类型,根据这个类型的两个变体来实现是否插入的功能。如果它接收到了OccupiedEntry(已经存在的情况)这个变体,它就会不插入值;反之,如果接收到了VacantEntry(不存在的情况)变体,它就不会执行插入操作。最重要的一点是,它是有返回值的,它的返回值是这个键对应值的可变引用(存在就返回HashMap中原有的键所对应的值的可变引用,不存在就先添加键值对然后返回值的可变引用),根据这个特性可以实现一些简单的计数器(后文会讲)。
看下例子:
use std::collections::HashMap; fn main() { let mut scores = HashMap::new(); scores.insert(String::from("dev1ce"), 0); scores.entry(String::from("Zywoo")).or_insert(100); scores.entry(String::from("dev1ce")).or_insert(60);println!("{:?}", scores);
}
- 第一个
entry语句查找了"Zywoo",发现没有,就返回VacantEntry,or_insert接收到了,就根据VacantEntry所关联的键和传入的参数100创建了(“Zywoo”, 100)这个键值对。 - 第二个
entry语句查找了"dev1ce",发现有了,就返回OccupiedEntry,or_insert接收到了,就停止插入新值,所以会保持(“dev1ce”, 0)不变。
输出:
{"Zywoo": 100, "dev1ce": 0}
如果这么讲还有些复杂,那么你可以把scores.entry(String::from("Zywoo")).or_insert(100);看作两行代码:
let e = `scores.entry(String::from("Zywoo"));
e.or_insert(100);
3.基于现有的值来更新
先看例子:
use std::collections::HashMap; fn main() { let text = "That's one small step for [a] man, one giant leap for mankind."; let mut map = HashMap::new(); for word in text.split_whitespace() { let count = map.entry(word).or_insert(0); *count += 1; } println!("{:#?}", map);
}
- 这个例子首先声明了一个字符串字面值,一段话,赋给了
text。 - 然后创建了
map这个HashMap - 接着使用了
for循环,text.split_whitespace()就是把text分割为了一组字符串的遍历器,用for来遍历。 - 遍历的时候,就判断单词在这个
map里出现没,出现了就不插入新值了,没出现就插入0作为新的键值对。最重要的是理解count,由于or_insert方法的返回值是这个键对应值的可变引用,所以没出现一次就把值的可变引用先解引用,在自加1就相当于完成了一次统计。
8.6.2. Hash函数
在默认情况下,HashMap使用加密功能强大的Hash函数,可以抵抗拒绝服务(DoS)攻击。但这种函数它不是可用的最快的Hash算法,它的优势是具有较好的安全性。如果觉得它性能不好,也可以指定不同的hasher来切换到另一个函数。hasher指的是实现BuildHasher trait的类型。
相关文章:
【Rust自学】8.6. HashMap Pt.2:更新HashMap
8.6.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编…...
Python异常处理详解:概念、语法与实践
1. 异常的概念 在Python中,异常(Exception)是程序运行时出现的错误或不正常情况。异常通常表示程序在运行时遇到了无法继续执行的条件。Python通过 try/except 语句来捕获和处理异常。 异常可以分为两类: 内建异常:…...
Kotlin在医疗大健康域的应用实例探究与编程剖析(上)
一、引言 1.1 研究背景与意义 在当今数字化时代,医疗行业正经历着深刻的变革。随着信息技术的飞速发展,尤其是人工智能、大数据、物联网等新兴技术的广泛应用,医疗行业数字化转型已成为必然趋势。这种转型旨在提升医疗服务的效率和质量,优化医疗资源配置,为患者提供更加…...
QT----------QT Data Visualzation
实现思路: 配置项目:在 .pro 文件中添加 QT datavisualization 以引入 QT Data Visualization 模块。创建主窗口:使用 QMainWindow 作为主窗口,添加 Q3DScatter、Q3DBars 和 Q3DSurface 等三维视图组件。初始化和创建三维图表&a…...
什么是Sight Words(信号词)
🧡什么是Sight Words(信号词) 简单来说,Sight Words就是我们在日常英语中常用的一些基本词汇。可以把它想象成是学练英语的“基础词汇”,这些词在各种考试中经常出现,也是在生活中必不可少的。 …...
SpringBoot日志快速集成详解-生产实战
SpringBoot日志快速集成详解 1. 添加依赖2. 创建 logback-spring.xml 配置文件示例 logback-spring.xml 配置: 3. 启用 Spring Boot 自动配置4. 配置 Spring Boot 启动日志级别5. 运行与验证 博文专注于最快速的实战,没有那么多逼逼叨叨的理论࿰…...
路由技术在网络中的作用及特点
作用:路径选择:在复杂的网络拓扑结构中,路由技术能够根据网络的当前状态和目标地址,为数据报文选择一条最佳的传输路径,确保数据能够快速、准确地到达目的地。例如,在互联网中,当用户访问一个网…...
【Python系列】Flask 与 FastAPI:两个 Python Web 框架的对比分析
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
云手机:虚拟技术的革命性应用与实体手机的优劣对比
在近年来,随着互联网的火速发展,云手机作为一种新兴的技术产品,在游戏行业特别是手游市场中掀起了一股热潮。云手机,顾名思义,是架设在ARM虚拟服务器上的手机,其独特的虚拟技术为用户带来了前所未有的使用体…...
3. C语言 数据类型
本章目录: 前言:C语言中的数据类型分类1. 基本数据类型1.1 整数类型1.2 浮点类型1.3 字符型常量1.4 字符串常量 2. 枚举类型3. void 类型void类型的使用示例: 4. 类型转换4.1 隐式类型转换4.2 显式类型转换类型转换的注意事项 5. 小结 前言&a…...
npm install 安装选项 -d -s -g
在使用 npm install 时,-d、-g 和 -s 是不同的选项,它们分别代表不同的安装模式或行为。以下是它们的详细解释: 1. -d:--save-dev 含义:将包安装为开发依赖(devDependencies)。使用场景&#…...
pdf预览兼容问题- chrome浏览器105及一下预览不了
使用的"tato30/vue-pdf": "^1.11.2"预览插件,发现chrome浏览器105及一下预览不了 pdfPreview预览组件: <template><div id"vue_pdf_view"><div class"tool_tip"><template v-if"pa…...
【可实战】需求分析-测试计划↓-测试设计-测试执行-测试总结↓(包含测试计划、测试总结模板,以公司要求为准)
一、完成软件测试工作的必要步骤 需求分析-测试计划-测试设计-测试执行-测试总结 二、测试计划 (一)测试计划模版 模板在线查看: https://docs.qq.com/doc/DV2hTamxJWnNDaUFF 模板(百度网盘): 链接&…...
MySQL 03 章——基本的SELECT语句
一、SQL概述 (1)SQL背景知识 SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言,与数据直接打交道不同的数据库管理系统生产厂商都支持SQL语句,但都有特有内容 …...
【项目】智能BI洞察引擎 测试报告
目录 一、项目背景BI介绍问题分析项目背景 二、项目功能三、功能测试1、登录测试测试用例测试结果 2、注册测试测试用例测试结果出现的bug 3、上传文件测试测试用例测试结果 4、AI生成图表测试测试用例测试结果 5、分析数据页面测试(异步)测试用例测试结…...
javaEE-文件操作和IO-文件
目录 一.什么是文件 1.文件就是硬盘(磁盘)上的文件。 2.计算机中存储数据的设备: 3.硬盘的物理特征 4.树型结构组织和⽬录 5.文件路径 文件路径有两种表示方式: 6.文件的分类 二、java中文件系统的操作 1.File类中的属性: 2.构造方…...
2025跨年倒计时
<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>2025年跨年倒计时</title><style>/* 页…...
下载mysql免安装版和配置
1、下载地址 点击去官网下载https://downloads.mysql.com/archives/community/ 2、解压安装mysql 解压的文件夹是没有my.ini文件和data目录,需要我们自己去创建 根目录下创建my.ini,根目录创建data [mysql] default-character-setutf8[mysqld] #端口 po…...
代码模板-C语言常用的errno的名字、值以及对应关系?转换字符串函数?(errno.h, strerror; errno -l; man errno)
背景 errno.h是C 编程语言标准库中的头文件。它定义了使用符号errno (“错误号”的缩写)报告和检索错误情况的宏。经常需要用来在内核态用户态返回错误寻找,本文以供快速检索。 常用函数与用法 strerror 根据errno获取文件 比如ÿ…...
全新免押租赁系统助力商品流通高效安全
内容概要 全新免押租赁系统的推出,可以说是一场商品流通领域的小革命。想象一下,不再为押金烦恼,用户只需通过一个简单的信用评估,就能快速租到所需商品,这种体验简直令人惊喜!这个系统利用代扣支付技术&a…...
STM32首次烧录选择erase sectors导致程序跑飞
一、故障现象小批量打样回来的板子,烧录程序后一切正常,蜂鸣器响0.5s,LED闪烁等待握手;但是断电重启后蜂鸣器长鸣,LED不闪烁,无法正常运行。二、分析解决过程首先我看了一下电源,电压、电流都是…...
Arduino I²C pH传感器库:高鲁棒性嵌入式pH测量方案
1. 项目概述 iarduino_I2C_pH 是一款专为 iArduino 系列 IC 接口 pH 传感器模块设计的 Arduino 兼容 C 库。该库面向嵌入式硬件工程师与固件开发者,提供对 pH-метр(pH 计)模块的完整底层控制能力,支持标准硬件 IC 外设&#…...
GD32F407标准库工程创建全流程:从官网固件库下载到Keil5编译通过
GD32F407标准库工程创建全流程:从官网固件库下载到Keil5编译通过 第一次接触GD32F407开发板时,最让人头疼的就是如何快速搭建开发环境。与STM32不同,GD32的官方资源分散,标准库文件结构复杂,新手很容易在文件复制和工程…...
2026届学术党必备的五大AI辅助写作网站推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下这个学术写作的场景范围里,论文AI工具已然变成辅助研究者去完成文献梳理的…...
N16 LCD
一、LCD简介LCD 液晶显示屏。i.MX6ULL 里驱动它的模块叫:eLCDIF Enhanced LCD Interface(增强型 LCD 接口,芯片内置的硬件控制器)分辨率:1920 * 1080 1280*720色域:帧率/刷新率:LCD 扫…...
企业做智能问数,最容易被低估的不是模型,而是人工预置工作量
在当前企业数据智能平台选型中,“大模型能力”常被视为决定成败的关键。然而,越来越多的实践表明:真正制约智能问数从 POC(概念验证)走向规模化落地的瓶颈,并非模型本身,而是隐藏在技术方案背后…...
YouTube面临儿童AI内容监管挑战
专家呼吁YouTube停止向儿童推荐AI视频近日,超200名儿童发展专家及相关机构联名致信谷歌和YouTube高层,强烈要求YouTube及YouTube Kids停止向未成年用户展示或推荐AI生成视频。这些专家指出,大量所谓有“教育用途”的AI视频其实内容空洞、质量…...
javaweb高校学生宿舍管理系统的设计与实现
目录同行可拿货,招校园代理 ,本人源头供货商高校学生宿舍管理系统功能分析学生信息管理模块宿舍分配管理模块费用管理模块报修与维修管理模块访客与门禁管理模块卫生检查与评分模块系统管理模块技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系…...
告别Python依赖!用这个纯TypeScript的stock-sdk,在浏览器和Node里轻松搞定A股港股美股行情
纯TypeScript金融数据解决方案:stock-sdk全场景开发指南 金融数据获取一直是前端和Node.js开发者面临的痛点。传统方案往往依赖Python生态,导致技术栈割裂、项目臃肿。而纯TypeScript实现的stock-sdk,以其零依赖、双端运行的特点,…...
图网络梯度计算与反向传播:自动微分技术的完整指南
图网络梯度计算与反向传播:自动微分技术的完整指南 【免费下载链接】graph_nets Build Graph Nets in Tensorflow 项目地址: https://gitcode.com/gh_mirrors/gr/graph_nets 在深度学习领域,图网络(Graph Networks)凭借其处…...
