最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

rust的vector和hashmap詳解

 更新時間:2023年03月17日 11:04:14   作者:zy010101  
這篇文章主要介紹了rust的vector和hashmap,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

動態(tài)數(shù)組Vector

在大多數(shù)語言中都會提供動態(tài)數(shù)組這樣基礎的數(shù)據(jù)結構。rust也不例外。動態(tài)數(shù)組允許我們存儲多個值,這些值在內存中一個緊挨著另一個排列。動態(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ù)導致頻繁的內存分配和拷貝,提升性能。而通過宏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來獲取元素,否則還是使用下標的方式會更好。

重提內存安全

讓我們首先來回顧一下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 也是內聚性的,即所有的 K 必須擁有同樣的類型,V 也是如此。跟 Vec 一樣,如果預先知道要存儲的 KV 對個數(shù),可以使用 HashMap::with_capacity(capacity) 創(chuàng)建指定大小的 HashMap,避免頻繁的內存分配和拷貝,提升性能。

根據(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); // 已經存在,因此50沒有插入
}

hashmap提供了兩個方法,其中insert方法在沒有鍵值對的情況會進行插入,有鍵值對的情況下進行覆蓋;而or_insert方法在沒有鍵值對的情況下進行插入,有鍵值對的情況下不插入。

根據(jù)鍵刪除hashmap的鍵值對

scores.remove("Blue");

使用remove方法即可根據(jù)鍵刪除值。

到此這篇關于rust的vector和hashmap的文章就介紹到這了,更多相關rust的vector和hashmap內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于Rust編譯時報link.exe?not?found錯誤問題

    關于Rust編譯時報link.exe?not?found錯誤問題

    這篇文章主要介紹了Rust編譯的時候報出link.exe?not?found錯誤問題,解決方法是在命令行就是CMD執(zhí)行相應的命令即可,本文給大家分解決方法,需要的朋友可以參考下
    2022-09-09
  • Rust?中?Mutex?的基本用法

    Rust?中?Mutex?的基本用法

    Rust?標準庫中的?Mutex?結構體位于?std::sync::Mutex?中,它提供了線程安全的數(shù)據(jù)訪問,Mutex?保證了在同一時間只有一個線程可以訪問被鎖定的數(shù)據(jù),這篇文章主要介紹了Rust?中?Mutex?的基本用法,需要的朋友可以參考下
    2024-05-05
  • rust交叉編譯問題及報錯解析

    rust交叉編譯問題及報錯解析

    這篇文章主要為大家介紹了rust交叉編譯問題及報錯解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Rust語言之結構體和枚舉的用途與高級功能詳解

    Rust語言之結構體和枚舉的用途與高級功能詳解

    Rust 是一門注重安全性和性能的現(xiàn)代編程語言,其中結構體和枚舉是其強大的數(shù)據(jù)類型之一,了解結構體和枚舉的概念及其高級功能,將使你能夠更加靈活和高效地處理數(shù)據(jù),本文將深入探討 Rust 中的結構體和枚舉,并介紹它們的用途和高級功能
    2023-10-10
  • 解析Rust?struct?中的生命周期

    解析Rust?struct?中的生命周期

    rust?的生命周期保證了內存的安全性,同時也增加了開發(fā)者的心智負擔。是在上線之前多費心思寫代碼,還是在上線以后忙忙活活查問題,這是個?trade?off?問題,這篇文章主要介紹了Rust?struct?中的生命周期,需要的朋友可以參考下
    2022-10-10
  • Rust中的引用循環(huán)與內存泄漏詳解

    Rust中的引用循環(huán)與內存泄漏詳解

    這篇文章主要介紹了在Rust中如何使用Rc和RefCell來創(chuàng)建引用循環(huán),以及引用循環(huán)可能導致的內存泄漏問題,文章還討論了如何使用Weak類型來解決引用循環(huán)問題,特別是在需要雙向引用的場景中,如樹形結構,通過理解和掌握這些智能指針的使用,可以編寫更高效且內存安全的Rust程序
    2025-02-02
  • Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法

    Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法

    在 Rust 中, 如果一個類型實現(xiàn)了 Iterator, 那么它會被同時實現(xiàn) IntoIterator, 具體邏輯是返回自身, 因為自身就是迭代器,這篇文章主要介紹了Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法,需要的朋友可以參考下
    2023-12-12
  • rust流程控制的具體使用

    rust流程控制的具體使用

    在Rust中,控制流包括條件語句、循環(huán)和匹配模式等,用于實現(xiàn)程序的邏輯和流程控制,本文就來詳細的介紹一下,感興趣的可以了解一下
    2023-12-12
  • Rust中的Drop特性之解讀自動化資源清理的魔法

    Rust中的Drop特性之解讀自動化資源清理的魔法

    Rust通過Drop特性實現(xiàn)了自動清理機制,確保資源在對象超出作用域時自動釋放,避免了手動管理資源時可能出現(xiàn)的內存泄漏或雙重釋放問題,智能指針如Box、Rc和RefCell都依賴于Drop來管理資源,提供了靈活且安全的資源管理方案
    2025-02-02
  • 如何用Rust打印hello world

    如何用Rust打印hello world

    這篇文章主要介紹了如何用Rust打印hello world,本文分步驟通過圖文并茂的形式給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

宁远县| 文登市| 永德县| 山东| 天津市| 东乡族自治县| 新乡市| 来安县| 浮梁县| 法库县| 黔江区| 隆子县| 芷江| 曲水县| 乐亭县| 揭西县| 大英县| 广安市| 岳西县| 米易县| 融水| 稷山县| 南澳县| 河南省| 嵊泗县| 长垣县| 儋州市| 九台市| 南皮县| 益阳市| 双城市| 沙雅县| 应用必备| 阳山县| 洛川县| 舟曲县| 卢氏县| 宁海县| 古浪县| 郯城县| 横山县|