Rust 数据结构:HashMap

Rust 数据结构:HashMap

  • Rust 数据结构:HashMap
    • 创建一个新的哈希映射
      • HashMap::new()
      • 将元组变成哈希表
    • 访问哈希映射中的值
    • 哈希映射和所有权
    • 更新哈希映射
      • 重写一个值
      • 仅当键不存在时才添加键和值
      • 基于旧值更新值
    • 散列函数

Rust 数据结构:HashMap

类型 HashMap<K, V> 使用散列函数存储 K 类型键到 V 类型值的映射。

创建一个新的哈希映射

HashMap::new()

创建空散列映射的一种方法是使用 new 和 insert 来添加元素。

    use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);

就像 vector 一样,哈希映射将它们的数据存储在堆上。它也是同构的:所有键必须具有相同的类型,所有值必须具有相同的类型。

将元组变成哈希表

use std::collections::HashMap;let vec = vec![("k1", "v1"), ("k2", "v2")];
let map: HashMap<_, _> = vec.into_iter().collect();

访问哈希映射中的值

我们可以通过向 get 方法提供键值来从哈希映射中获取值。

    use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);let team_name = String::from("Blue");let score = scores.get(&team_name).copied().unwrap_or(0);

在这里,score将为 10。get 方法返回一个 Option<&V>,如果该键在哈希映射中没有值,get 将返回 None。这个程序通过调用 copied 来处理 Option,得到一个 Option<i32>,而不是一个 Option<&i32>,然后 unwrap_or 将 score 设置为 0,如果 scores 没有对应键的条目。

我们可以用 for 循环迭代哈希映射中的每个键值对:

    use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);for (key, value) in &scores {println!("{key}: {value}");}

哈希映射和所有权

对于实现 Copy trait 的类型,比如 i32,值被复制到哈希映射中。对于 String,这些值将被移动,哈希映射将成为这些值的所有者。

    use std::collections::HashMap;let field_name = String::from("Favorite color");let field_value = String::from("Blue");let mut map = HashMap::new();map.insert(field_name, field_value);// field_name and field_value are invalid at this point, try using them and// see what compiler error you get!

在调用 insert 将变量 field_name 和 field_value 移动到哈希映射之后,我们就不能使用它们了。

如果我们将值的引用插入到哈希映射中,这些值不会被移动到哈希映射中。引用所指向的值必须至少在哈希映射有效的时间内有效。

更新哈希映射

尽管键和值对的数量是可增长的,但每个唯一键一次只能有一个与之关联的值。

重写一个值

如果我们在哈希映射中插入一个键和一个值,然后用不同的值插入相同的键,那么与该键相关联的值将被替换。

    use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Blue"), 25);println!("{scores:?}");

仅当键不存在时才添加键和值

通常检查一个特定的键是否已经存在于哈希映射中并带有值,然后采取以下操作:如果键确实存在于哈希映射中,则现有的值应保持原样;如果键不存在,则插入它并为它插入一个值。

哈希映射为此有一个特殊的 API,称为 entry,它将您想要检查的键作为参数。entry 方法的返回值是一个名为 entry 的枚举,它表示一个可能存在也可能不存在的值。

    use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.entry(String::from("Yellow")).or_insert(50);scores.entry(String::from("Blue")).or_insert(50);println!("{scores:?}");

or_insert 方法被定义为:如果对应的键存在,则返回对该键值的可变引用,如果不存在,则将该参数作为该键的新值插入,并返回对新值的可变引用。这种技术比我们自己编写逻辑要干净得多,而且与借用检查器配合得更好。

基于旧值更新值

哈希映射的另一个常见用例是查找键的值,然后根据旧值更新它。

    use std::collections::HashMap;let text = "hello world wonderful world";let mut map = HashMap::new();for word in text.split_whitespace() {let count = map.entry(word).or_insert(0);*count += 1;}println!("{map:?}");

split_whitespace 方法返回一个迭代器,该迭代器覆盖文本中值的子片,这些子片由空格分隔。or_insert 方法返回一个对指定键值的可变引用(&mut V)。这里,我们将该可变引用存储在 count 变量中,因此为了对该值赋值,必须首先使用 * 解引用。可变引用在 for 循环结束时将超出作用域,因此所有这些更改都是安全的,并且是借用规则允许的。

散列函数

默认情况下,HashMap 使用名为 SipHash 的哈希函数,该函数可以抵抗涉及哈希表的拒绝服务(DoS)攻击。这不是最快的散列算法,但相对安全。

散列器是一种实现 BuildHasher trait 的类型,可以通过指定不同的哈希器来切换到另一个散列函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【从设置到上传的全过程】本地多个hexo博客,怎么设置ssh才不会互相影响

偶然间&#xff0c;想多建一个博客&#xff0c;但电脑已经有一个博客了&#xff0c;怎么设置ssh才不会互相影响呢&#xff1f; 在 Windows 系统上设置多个 Hexo 博客的 SSH 配置&#xff0c;避免互相影响&#xff0c;通常户就需要为每个博客配置不同的 SSH 密钥&#xff0c;并…

【时时三省】(C语言基础)字符数组应用举例2

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 例题&#xff1a; 有3个字符串&#xff0c;要求找出其中“最大”者。 解题思路&#xff1a; 可以设一个二维的字符数组str&#xff0c;大小为320&#xff0c;即有3行20列&#xff08;每一…

2025认证杯挑战赛第二阶段B题【 谣言在社交网络上的传播 】原创论文讲解(含完整python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了认证杯数学中国数学建模网络挑战赛第二阶段B题目谣言在社交网络上的传播完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半…

Qt功能区:Ribbon使用

Ribbon使用 1. Ribbon功能区介绍1.1 样式 2. 基本功能区设置2.1 安装动态库&#xff08;推荐&#xff09;2.2 在MainWindow中使用Ribbon2.3 在QWidget中使用SARibbonBar2.4 创建Category和Pannel2.5 ContextCategory 上下文标签创建 2.6 ApplicationButton2.7 QuickAccessBar和…

Ubnutu ADB 无法识别设备的解决方法

1. 正确安装adb 下载地址 2. 检查 Linux 是否识别设备 lsusb通过上述指令&#xff0c;分别查询插入、断开设备的usb设备表&#xff0c;如下所示&#xff1a; # 插入设备 adbc:~$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 011:…

C# 实现雪花算法(Snowflake Algorithm)详解与应用

在现代分布式系统中&#xff0c;生成全局唯一的标识符&#xff08;ID&#xff09;是一个非常重要的问题。随着微服务架构和分布式系统的普及&#xff0c;传统的单机数据库生成 ID 的方式已无法满足高并发和高可用的需求。为了解决这个问题&#xff0c;Twitter 提出了 雪花算法&…

STM32+ESP8266连接onenet新平台

若该文为原创文章&#xff0c;转载请注明原文出处。 阿里云物联网平台无法开通了&#xff0c;所以尝试使用onenet平台。 一、硬件 1、STM32F103C8T6最⼩系统板 2、ESP-01S 3、DHT11 二、软件 1、KEIL5.29 2、Token生成工具 3、app inventor 三、原理 四、平台搭建 1、注…

深入解析Spring Boot与Redis集成:高效缓存实践

深入解析Spring Boot与Redis集成&#xff1a;高效缓存实践 引言 在现代Web应用开发中&#xff0c;缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的键值存储数据库&#xff0c;广泛应用于缓存、会话管理和消息队列等场景。本文将详细介绍如何在Spring Boot项目中…

Python自学笔记3 常见运算符

常用运算符 加减法 python的自动数据类型转换 整形转为浮点型 实数转为复数 数字类型不能和浮点数类型相加减 乘除法 数据转换基本同加减法&#xff0c; 但字符串可以和整数相加减&#xff0c;作用是字符串的自我复制 反斜杠 成员运算符 判断一个元素是不是一个序列的成员…

[特殊字符]接口测试用例设计指南:全面覆盖与精准验证

一、接口测试的核心价值 接口作为系统间通信的桥梁&#xff0c;其稳定性和准确性直接影响业务功能。通过科学设计的测试用例&#xff0c;可以提前暴露接口潜在缺陷&#xff0c;降低上下游系统的耦合风险。本文将系统讲解接口测试的用例设计策略&#xff0c;覆盖查询类接口与操…

[SpringBoot]Spring MVC(2.0)

紧接上文&#xff0c;这篇我们继续讲剩下的HTTp请求 传递JSON数据 简单来说&#xff1a;JSON就是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表⽰⼀个对象或数组的信息,因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换 JSON的语法 1. 数据在 键值对(Key/Value) …

锚点跳转跟踪#

一、html <div ref"computingref"><section id"section1"> </section><section id"section2"> </section><section id"section3"> </section> </div><div class"nav-list&q…

一文了解多模态大模型LLaVA与LLaMA的概念

目录 一、引言 二、LLaVA与LLaMA的定义 2.1 LLaMA 2.2 LLaVA 2.3 LLaVA-NeXT 的技术突破 三、产生的背景 3.1 LLaMA的背景 3.2 LLaVA的背景 四、与其他竞品的对比 4.1 LLaMA的竞品 4.2 LLaVA的竞品 五、应用场景 5.1 LLaMA的应用场景 5.2 LLaVA的应用场景 六…

【LLM】大模型算力基础设施——核心硬件GPU/TPU,架构技术NVLink/RDMA,性能指标FP64/FLOPS(NVIDIA Tesla型号表)

【LLM】大模型算力基础设施——核心硬件GPU/TPU&#xff0c;架构技术NVLink/RDMA&#xff0c;性能指标FP64/FLOPS&#xff08;NVIDIA Tesla型号表&#xff09; 文章目录 1、核心硬件GPU/TPU&#xff0c;NVIDIA Tesla2、集群架构设计 NVLink / RDMA / Alluxio3、性能关键指标&am…

spark的Standalone模式介绍

Apache Spark 的 Standalone 模式是其自带的集群管理模式&#xff0c;无需依赖外部资源管理器&#xff08;如 YARN 或 Mesos&#xff09;&#xff0c;可快速部署和运行 Spark 集群。以下是对 Standalone 模式的详细介绍&#xff1a; 1. 核心组件 Master 节点 集群的主控制器…

YOLOv7训练时4个类别只出2个类别

正常是4个类别&#xff1a; 但是YOLOv7训练完后预测总是只有两个类别&#xff1a; 而且都是LFM和SFM 我一开始检查了下特征图大小&#xff0c;如果输入是640*640的话&#xff0c;三个尺度特征图是80*80,40*40,20*20&#xff1b;如果输入是416*416的话&#xff0c;三个尺度特征…

【Unity】用事件广播的方式实现游戏暂停,简单且实用!

1.前言 在做Unity项目的时候&#xff0c;要考虑到“游戏暂停”的功能&#xff0c;最直接的办法是修改游戏的Time.TimeScale 0f。但是这种方式的影响也比较大&#xff0c;因为它会导致游戏中很多程序无法正常运行。 于是我就有了一个想法&#xff0c;在游戏中想要暂停的对象&…

Suna: 开源多面手 AI 代理

GitHub&#xff1a;GitHub - kortix-ai/suna: Suna - Open Source Generalist AI Agent 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI Suna 是一个完全开源的 AI 助手&#xff0c;可帮助您轻松完成实际任务。通过自然对话&#xff0c…

直接从图片生成 html

1. 起因&#xff0c; 目的: 无意间碰到一个网站: https://wise.com/zh-cn/currency-converter/brl-to-cny-rate其实我就是想搜一下巴西的货币单位是什么。这个网站的设计很漂亮&#xff0c; 尤其是颜色搭配很不错&#xff0c;讨人喜欢。所以我想让 AI 帮我生成类似的效果。本文…

验证码与登录过程逻辑学习总结

目录 前言 一、验证码与登录 二、使用步骤 1.先apipost测试一波 2.先搞验证码 3.跨域问题 4.后端走起 总结 前言 近期要做一个比较完整的demo&#xff0c;需要自己做一个前端登录页面&#xff0c;不过api接口都是现成的&#xff0c;一开始以为过程会很easy&#xff0c;…