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.pswp.cn/web/80254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80254.shtml
英文地址,請注明出處:http://en.pswp.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;…