跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 卖家故事 > 【Rust】——HashMap

【Rust】——HashMap

时间:2024-03-24 15:52:52 来源:网络cs 作者:利杜鹃 栏目:卖家故事 阅读:

标签:
阅读本书更多章节>>>>

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

🐠离散数学:离散数学_IT闫的博客-CSDN博客

​​​​​​🥽Linux:​​​​Linux_Y小夜的博客-CSDN博客

🚝Rust:Rust_Y小夜的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯HashMap,t>

🎯创建HashMap

🎯HashMap和所有权

🎯访问HashMap中的值

🎯更新HashMap

✨覆盖值

✨只有K不对应任何值的情况下,才插入V

✨基于现有V更新V

🎯Hash函数


🎯HashMap<K,T>

HashMap<K, V> 类型储存了一个键类型 K 对应一个值类型 V 的映射。它通过一个 哈希函数hashing function)来实现映射,决定如何将键和值放入内存中。很多编程语言支持这种数据结构,不过通常有不同的名字:哈希、map、对象、哈希表或者关联数组。

🎯创建HashMap

可以使用 new 创建一个空的 HashMap,并使用 insert 增加元素。

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

注意必须首先 use 标准库中集合部分的 HashMap

        在这三个常用集合中,HashMap 是最不常用的,所以并没有被 prelude 自动引用。标准库中对 HashMap 的支持也相对较少,例如,并没有内建的构建宏。

        像 vector 一样,哈希 map 将它们的数据储存在堆上,这个 HashMap 的键类型是 String 而值类型是 i32。类似于 vector,哈希 map 是同质的:所有的键必须是相同类型,值也必须都是相同类型。

🎯HashMap和所有权

        对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者。

    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 和 field_value 不再有效,    // 尝试使用它们看看会出现什么编译错误!

        当 insert 调用将 field_name 和 field_value 移动到哈希 map 中后,将不能使用这两个绑定。

🎯访问HashMap中的值

可以通过 get 方法并提供对应的键来从哈希 map 中获取值

    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);

可以使用与 vector 类似的方式来遍历哈希 map 中的每一个键值对

    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}");    }

🎯更新HashMap

尽管键值对的数量是可以增长的,每个唯一的键只能同时关联一个值。

✨覆盖值

如果我们插入了一个键值对,接着用相同的键插入一个不同的值,与这个键相关联的旧值将被替换。

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

✨只有K不对应任何值的情况下,才插入V

        我们经常会检查某个特定的键是否已经存在于哈希 map 中并进行如下操作:如果哈希 map 中键已经存在则不做任何操作。如果不存在则连同值一块插入。

        为此哈希 map 有一个特有的 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);

✨基于现有V更新V

一个常见的哈希 map 的应用场景是找到一个键对应的值并根据旧的值更新它。

    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);

🎯Hash函数

   HashMap 默认使用一种叫做 SipHash 的哈希函数,它可以抵御涉及哈希表(hash table的拒绝服务(Denial of Service, DoS)攻击。

        然而这并不是可用的最快的算法,不过为了更高的安全性值得付出一些性能的代价。如果性能监测显示此哈希函数非常慢,以致于你无法接受,你可以指定一个不同的 hasher 来切换为其它函数。hasher 是一个实现了 BuildHasher trait 的类型。

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/gushi/2024-03-24/147993.html,文章来源:网络cs,作者:利杜鹃,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇:C++——string类

下一篇:返回列表

文章评论