rust的vector和hashmap詳解
動態(tài)數(shù)組Vector
在大多數(shù)語言中都會提供動態(tài)數(shù)組這樣基礎的數(shù)據(jù)結構。rust也不例外。動態(tài)數(shù)組允許我們存儲多個值,這些值在內(nèi)存中一個緊挨著另一個排列。動態(tài)數(shù)組中只能存儲相同類型的元素。
創(chuàng)建動態(tài)數(shù)組
使用Vec::new()
創(chuàng)建動態(tài)數(shù)組或者是使用宏vec![]
創(chuàng)建數(shù)組。例如:
fn main() { let mut a = Vec::new(); a.push(1); let b = vec![1]; println!("a:{}", a[0]); println!("b:{}", b[0]); }
rust的編譯器非常智能,它通過a.push(1)
推斷出了a的類型是Vec<i32>
,如果預先知道要存儲的元素個數(shù),可以使用 Vec::with_capacity(capacity)
創(chuàng)建動態(tài)數(shù)組,這樣可以避免因為插入大量新數(shù)據(jù)導致頻繁的內(nèi)存分配和拷貝,提升性能。而通過宏vec![]
創(chuàng)建動態(tài)數(shù)組可在創(chuàng)建同時給予初始化值。還有一點需要注意,上例中的a是可變變量,而b是不可變變量。因此無法使用b.push來追加元素。
向數(shù)組末尾追加元素
使用push方法可以向數(shù)組末尾增加元素。需要確保數(shù)組變量是可變變量。例如:
let mut a = Vec::new(); a.push(1);
從Vector中讀取元素
讀取指定位置的元素有兩種方式可選:
- 通過下標索引訪問,直接獲取元素值
- 使用 get 方法,獲取到
Option<&T>
一個實際的例子如下所示:
#![allow(unused)] fn main() { let v = vec![1, 2, 3, 4, 5]; let third: &i32 = &v[2]; println!("第三個元素是 {}", third); match v.get(2) { Some(third) => println!("第三個元素是 {third}"), None => println!("去你的第三個元素,根本沒有!"), } }
和其它語言一樣,集合類型的索引下標都是從 0 開始,&v[2]
表示借用 v 中的第三個元素。如果存在下標越界的可能,那么建議使用get來獲取元素,否則還是使用下標的方式會更好。
重提內(nèi)存安全
讓我們首先來回顧一下rust的所有權系統(tǒng)以及引用(借用)。
所有權系統(tǒng)
- Rust 中的每一個值都有一個 所有者(owner)。
- 值在任一時刻有且只有一個所有者。
- 當所有者(變量)離開作用域,這個值將被丟棄。
引用規(guī)則
- 同一作用域,一個變量只能有一個可變引用;
- 在同一作用域,一個變量可以有多個不可變引用,不允許同時存在可變引用和不可變引用。
現(xiàn)在,讓我們直接看下面這段代碼。
hashmap
rust標準庫提供了hashmap,和其它語言的hashmap, map, object, dict等類似。
創(chuàng)建hashmap
use std::collections::HashMap; fn main() { // 創(chuàng)建一個HashMap,用于存儲寶石種類和對應的數(shù)量 let mut my_gems = HashMap::new(); }
HashMap 并沒有包含在 Rust 的 prelude 中,因此需要使用use來引入hashmap。通過new來創(chuàng)建一個hashmap。也可以有其它的方式來創(chuàng)建hashmap。例如:
let target = [("A", 1), ("B", 2), ("C", 5), ("D", 8)]; let target = HashMap::from(target); println!("{:?}", target);
新增鍵值對
使用insert方法即可新增鍵值對。例如:
// 將寶石類型和對應的數(shù)量寫入表中 my_gems.insert("紅寶石", 1); my_gems.insert("藍寶石", 2); my_gems.insert("河邊撿的誤以為是寶石的破石頭", 18);
需要注意的是 HashMap 也是內(nèi)聚性的,即所有的 K 必須擁有同樣的類型,V 也是如此。跟 Vec 一樣,如果預先知道要存儲的 KV 對個數(shù),可以使用 HashMap::with_capacity(capacity) 創(chuàng)建指定大小的 HashMap,避免頻繁的內(nèi)存分配和拷貝,提升性能。
根據(jù)鍵查詢值
可以通過get方法來根據(jù)鍵名查詢值,不過get方法返回的是Option<&T>
類型,需要使用unwrap來解析。例如:
println!("{:?}", my_gems.get("紅寶石").unwrap());
同時在for循環(huán)中,可以更方便的遍歷hashmap,例如:
for (k, v) in my_gems { println!("key is {k}, value is {v}"); }
更新hashmap中的值
fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert("Blue", 10); // 覆蓋已有的值 let old = scores.insert("Blue", 20); assert_eq!(old, Some(10)); // 查詢新插入的值 let new = scores.get("Blue"); assert_eq!(new, Some(&20)); // 查詢Yellow對應的值,若不存在則插入新值 let v = scores.entry("Yellow").or_insert(5); assert_eq!(*v, 5); // 不存在,插入5 // 查詢Yellow對應的值,若不存在則插入新值 let v = scores.entry("Yellow").or_insert(50); assert_eq!(*v, 5); // 已經(jīng)存在,因此50沒有插入 }
hashmap提供了兩個方法,其中insert方法在沒有鍵值對的情況會進行插入,有鍵值對的情況下進行覆蓋;而or_insert方法在沒有鍵值對的情況下進行插入,有鍵值對的情況下不插入。
根據(jù)鍵刪除hashmap的鍵值對
scores.remove("Blue");
使用remove方法即可根據(jù)鍵刪除值。
到此這篇關于rust的vector和hashmap的文章就介紹到這了,更多相關rust的vector和hashmap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于使用rust調(diào)用c++靜態(tài)庫并編譯nodejs包的問題
這篇文章主要介紹了使用rust調(diào)用c++靜態(tài)庫并編譯nodejs包的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08Rust-使用dotenvy加載和使用環(huán)境變量的過程詳解
系統(tǒng)的開發(fā),測試和部署離不開環(huán)境變量,今天分享在Rust的系統(tǒng)開發(fā)中,使用dotenvy來讀取和使用環(huán)境變量,感興趣的朋友跟隨小編一起看看吧2023-11-11rust的nutyp驗證和validator驗證數(shù)據(jù)的方法示例詳解
本文介紹了在Rust語言中,如何使用nuType和validator兩種工具來對Cargo.toml和modules.rs文件進行驗證,通過具體的代碼示例和操作步驟,詳細解釋了驗證過程和相關配置,幫助讀者更好地理解和掌握使用這兩種驗證工具的方法,更多Rust相關技術資訊,可繼續(xù)關注腳本之家2024-09-09