Rust 数据结构:HashMap

Rust学习教程33 - HashMap KV存储HashMap 和动态数组一样,HashMap也是Rust标准库中提供的集合类型,但是又与动态数组不同,HashMap中存储的是一一映射的KV键值对,并提供了平均复杂度为O(1)的查询方法,当我们希望通过一个Key去查询值时,该类型非常有用,以致于Go语言将该类型设置成了语言级别的内置特性。 Rust中哈希类型为HashMap<K,V>, 在其它. 阅读详情

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 的类型,可以通过指定不同的哈希器来切换到另一个散列函数。

无线通信入门:3种键控法(ASK/FSK/PSK)原理图解与实战对比 本文深入解析无线通信中ASK、FSK、PSK三种基础键控法的原理与应用。通过图解对比,阐明幅移键控(ASK)简单低成本但抗干扰差,频移键控(FSK)稳健且应用广泛,相移键控(PSK)高效但复杂。文章结合实战场景,为物联网和嵌入式开发者在选型时提供关键指导,帮助平衡数据速率、成本、功耗与抗干扰需求。 阅读详情

相关推荐

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

简单光学 2034

Rust学习总结之HashMap

Rust学习总结之Hashmap,最全的总结

ftzchina的博客 3171

【阅读文献笔记】FoundationStereo: Zero-Shot Stereo Matching

提出首个零样本泛化立体匹配基础模型设计 STA 模块融合单目先验提出 AHCF 模块增强代价滤波构建 100 万合成数据集 FSD + 自净化流程。

qq_46460379的博客 1257

【Rust 基础篇】Rust HashMap 类型详解

在 Rust 中,可以使用标准库提供的 HashMap 类型来创建 HashMap 对象。然后,可以使用在上述示例中,我们创建了一个空的 HashMap 对象map。需要注意的是,map是可变的(mut关键字),这意味着我们可以修改它的内容。另一种常见的创建 HashMap 对象的方式是使用在上面的示例中,我们创建了一个 HashMap 对象map,其中包含了两个键值对:“Alice” 对应的值为 27,“Bob” 对应的值为 31。需要注意的是,我们在创建 HashMap 对象时指定了键的类型为。

繁依Fanyi的博客 1962

从零开始:用7353张VOC/YOLO格式混凝土缺陷数据集训练你的第一个检测模型

本文详细介绍了如何使用7353张VOC/YOLO格式的混凝土缺陷数据集训练首个目标检测模型。从环境配置、数据解析到YOLOv5模型训练与优化,提供了完整的实战指南,特别针对数据不平衡问题给出了解决方案,助力开发者快速掌握混凝土缺陷识别技术。

weixin_42651281的博客 255

mmdetection 实战:基于Mask R-CNN与自定义COCO数据集的目标检测全流程解析

本文详细解析了如何使用mmdetection框架和Mask R-CNN模型,基于自定义COCO数据集完成目标检测任务的全流程。内容涵盖环境搭建、数据格式转换、配置文件定制化、模型训练与评估等核心步骤,并提供了针对工业缺陷检测场景的实用调优思路与避坑指南,帮助开发者高效构建高性能检测模型。

weixin_29046611的博客 136

Rust 16: HashMap掰开揉碎:数组 + 哈希冲突处理 + 扩容

包含四部分:HashMap的底层数组存储结构和基本原理;如何处理Hash碰撞;如何扩容;Rust中HashMap的使用。

编程架构三分天下:分层、分治、分时序。 2302

C++和蓝图1:Unreal Engine 中 C++ 与蓝图的桥梁

摘要: 本文介绍了Unreal Engine(UE)中C++与蓝图可视化脚本的结合机制,重点解析了宏系统(UCLASS、UPROPERTY、UFUNCTION)如何实现代码与蓝图的交互。相比Unity的纯C#脚本模式,UE的双轨制开发允许程序员用C++处理核心逻辑,同时通过蓝图让非程序员快速迭代。文章对比了两大引擎的编程范式差异,指出UE的反射系统和宏标记提供了更精细的控制,并给出了从Unity迁移到UE的具体思路。核心在于理解UE的混合编程优势:C++保证性能,蓝图提升开发效率,二者通过宏系统无缝协作。

qq_46348216的博客 1407

【Rust】——HashMap

🎯HashMap 🎯创建HashMap 🎯HashMap和所有权 🎯访问HashMap中的值 🎯更新HashMap ✨覆盖值 ✨只有K不对应任何值的情况下,才插入V ✨基于现有V更新V 🎯Hash函数

shsjssnn的博客 1838

【AI智能体】Claude Code 高级编程技巧实战项目详解

Claude Code 高级编程技巧实战项目详解

congge 1万+

假新闻检测论文分享(25)L-DefenseExplainable Fake News Detection With Large Language Model

现有的假新闻检测工作主要集中在通过深度网络结合多种信息来学习假新闻的潜在特征,如可信度、立场、传播模式、额外知识、域外数据等。尽管他们在探测上取得了成功,但受限于他们的黑箱性质,他们无法提供任何对公众至关重要的理由。为解决这一问题,一些研究致力于可解释假新闻检测(EFND),旨在同时生成准确性预测和解释。许多工作通过注意力机制在相关报道中注意突出特别的单词、短语或句子来提供可解释性。然而,这些工作只发现了对最终预测有高贡献的区域,缺乏直观和可信的解释。

weixin_41964296的博客 730

使用 HashMap 存储键值对:Rust 中的关联数据结构

在日常编程中,我们常常需要一种数据结构来存储键与值之间的映射关系,比如根据球队名称查找积分、根据单词统计出现次数,或实现简单的配置系统。Rust 中提供的 `HashMap<K, V>` 就是这样一种灵活的关联数组,它利用哈希函数来决定如何将键和值存储在内存中。与其他语言中的“map”、“字典”、“关联数组”或“哈希表”类似,Rust 的哈希映射让我们可以通过任意类型的键来快速查找对应的值。

hello.reader 722

购物车智能检测系统:YOLO26 + PyQt5 毕设实现

YOLO26 + PyQt5 完成购物车商品检测系统:标注数据集(OpenImages 筛选 + 自制 500 张),训练 100 epoch 得到 mAP50 约 0.89,集成商品定价后输出总价。建议先用 OpenImages 预训练权重在自制数据上调优(冻住 backbone 前 50 epoch),等 loss 稳定后再解冻全量训练。

m0_64661770的博客 55

1.4 String、Vec、HashMap 实战:Rust 核心数据结构完全指南,告别 C++ 的坑

本文深入介绍了Rust中的核心数据结构String、Vec和HashMap。String提供了强大的字符串处理能力,支持UTF-8编码,包含创建、追加、切片等操作。Vec作为动态数组,演示了元素添加、删除、访问和遍历的方法,并解释了其内存管理机制。文章通过反转字符串、检查回文等实战案例,帮助开发者掌握这些数据结构的实际应用。

yonggeit的博客 2913

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

详解Rust标准库:HashMap

哈希表又称散列表,是一种键 - 值()对的数据结构,也被称为关联数组或字典。它主要用于存储和快速检索基于特定键的数据这里使用:使用二次探测和 SIMD 查找实现的哈希映射HashMap定义// 指定hash器为RandomState// 实现了具体的哈希映射功能。

weixin_62799021的博客 925

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Rust-10-数据类型

Rust 的核心语言中只有一种字符串类型:字符串 slice str ,它通常以被借用的形式出现,&str。字符串 slices:它们是一些对储存在别处的 UTF-8 编码字符串数据的引用。举例来说,由于字符串字面值被储存在程序的二进制输出中,因此字符串字面值也是字符串 slices。字符串(String )类型由 Rust 标准库提供,而不是编入核心语言,它是一种可增长、可变、可拥有、UTF-8 编码的字符串类型。而且 String 和 字符串 slices 都是UTF-8 编码的。

weixin_43714208的博客 1933

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Rust】9. 常见集合

r

newCraftsman的博客 382

Rustlings 11_hashmaps 练习解析:用 HashMap 掌握 Rust 键值映射的实战用法

Rustlings 的 `11_hashmaps` 练习组([exercises/11_hashmaps/README.md](https://link.gitcode.com/i/baa6b5dc47cb40ada3c5fcded0790988))带你完成 Rust 标准库中 HashMap 数据结构的完整入门:从声明与插入键值对,到 Entry API 的条件插入,再到用 HashMap 做分

gitblog_01030的博客 388

Rust中的collections

简要介绍Rust中的collections

weixin_73622063的博客 566

RUST 笔记(四)

通用集合 vector、字符串、 哈希 map vector(可以理解为list) 初始化 let v: Vec&amp;lt;i32&amp;gt; = Vec::new(); 使用初始值来创建 vec! 宏:let v = vec![1, 2, 3]; //新增值 v.push(5); //读取值 let v = vec![1, 2, 3, 4, 5]; let third: &amp;amp;i32 = &amp;am...

不忘初心,方得始终 749

leetcode-rust性能优化技巧:让你的Rust代码运行更快

想要在LeetCode竞赛中脱颖而出吗?掌握Rust性能优化技巧是关键!leetcode-rust项目是一个使用Rust语言解决LeetCode问题的完整解决方案库,通过这个项目你可以学习到如何编写高效、快速的Rust代码。本文将分享7个实用的性能优化技巧,帮助你在算法竞赛中获得更好的成绩。🚀 ## 为什么Rust在LeetCode中表现优异? Rust以其内存安全性和零成本抽象特性,在算法

gitblog_00032的博客 322

Rust常用集合类型——最全

HashSet和BTreeSet其实就是HashMap和BTreeMap把Value设置为空元组的特定类型,等价于HashSet和BTreeSettrait是对类型行为的抽象,Rust 提供了一些常用的 traits,可以通过 #[derive()] 属性自动为结构体或枚举实现这些 traits。线性序列:向量(Vec)、双端队列(VecDeque)、链表(LinkedList)Rust中的值默认被分配到栈内存,可以通过Box将值装箱(在堆内存中分配)。

weixin_51460943的博客 1332

leetcode-rust中的5个核心算法技巧:提升你的Rust编程能力

在竞争激烈的编程世界中,掌握高效算法是提升Rust编程能力的关键。leetcode-rust项目提供了丰富的Rust语言算法实现,本文将深入剖析其中5个核心算法技巧,帮助你快速提升解决复杂问题的能力。这些技巧不仅适用于LeetCode题目,更能在实际项目开发中发挥重要作用。 ## 1. 栈的巧妙应用:括号匹配问题的高效解法 栈是处理嵌套结构的理想数据结构,在括号匹配问题中表现尤为突出。leet

gitblog_01178的博客 1096

Rust之通用集合类型

在Rust语言中包含了一系列被称为集合的数据结构。大部分的数据结构都代表着某个特定的值,但集合却可以包含多个值。与内置的数组与元组类型不同,这些集合将自己持有的数据存储在了堆上。这意味着数据的大小不需要在编译时确定,并且可以随着程序的运行按需扩大或缩小数据占用的空间。

a_qwq_a的博客 862

Rust 性能优化的五个技巧

例如,`HashMap` 在查找时虽然平均时间复杂度为 O(1),但在键值较少时可能不如 `Vec` 直接遍历高效。对于需要频繁插入删除的场景,`BTreeMap` 可能比 `HashMap` 更稳定。`SmallVec` 或 `ArrayVec` 这类库可以在元素较少时完全避免堆分配,大幅提升小数据集的处理速度。使用 `for_each` 代替 `for` 循环在某些场景下也能带来性能提升,因为它避免了额外的边界检查。对于短生命周期的小对象,可以考虑使用栈分配或 `Box` 来避免堆分配的开销。

rqlxfq_937的博客 186

深入cached:揭秘Rust中最强大的5种缓存结构实现原理

在高性能Rust应用开发中,缓存系统是提升数据访问速度的核心组件。**cached**作为Rust生态中功能全面的缓存库,提供了多种灵活高效的缓存结构实现,帮助开发者轻松应对不同场景下的性能优化需求。本文将深入解析cached库中5种核心缓存结构的实现原理、适用场景及最佳实践,让你快速掌握Rust缓存设计的精髓。 ## 📌 1. 无界缓存(UnboundCache):简单高效的基础缓存 无界

gitblog_00607的博客 497
上一篇: Rust 学习笔记:关于 String 的练习题
下一篇: Rust 学习笔记:关于 HashMap 的练习题
UestcXiye
博客等级 码龄8年 9028粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值