溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

rust的vector和hashmap怎么創(chuàng)建

發(fā)布時(shí)間:2023-03-17 14:11:17 來(lái)源:億速云 閱讀:121 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下rust的vector和hashmap怎么創(chuàng)建的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

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

    在大多數(shù)語(yǔ)言中都會(huì)提供動(dòng)態(tài)數(shù)組這樣基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。rust也不例外。動(dòng)態(tài)數(shù)組允許我們存儲(chǔ)多個(gè)值,這些值在內(nèi)存中一個(gè)緊挨著另一個(gè)排列。動(dòng)態(tài)數(shù)組中只能存儲(chǔ)相同類型的元素。

    創(chuàng)建動(dòng)態(tài)數(shù)組

    使用Vec::new()創(chuàng)建動(dò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的編譯器非常智能,它通過(guò)a.push(1)推斷出了a的類型是Vec<i32>如果預(yù)先知道要存儲(chǔ)的元素個(gè)數(shù),可以使用 Vec::with_capacity(capacity) 創(chuàng)建動(dòng)態(tài)數(shù)組,這樣可以避免因?yàn)椴迦氪罅啃聰?shù)據(jù)導(dǎo)致頻繁的內(nèi)存分配和拷貝,提升性能。而通過(guò)宏vec![]創(chuàng)建動(dòng)態(tài)數(shù)組可在創(chuàng)建同時(shí)給予初始化值。還有一點(diǎn)需要注意,上例中的a是可變變量,而b是不可變變量。因此無(wú)法使用b.push來(lái)追加元素。

    向數(shù)組末尾追加元素

    使用push方法可以向數(shù)組末尾增加元素。需要確保數(shù)組變量是可變變量。例如:

    let mut a = Vec::new();
    a.push(1);

    從Vector中讀取元素

    讀取指定位置的元素有兩種方式可選:

    • 通過(guò)下標(biāo)索引訪問(wèn),直接獲取元素值

    • 使用 get 方法,獲取到Option<&T>

    一個(gè)實(shí)際的例子如下所示:

    #![allow(unused)]
    fn main() {
    let v = vec![1, 2, 3, 4, 5];
    
    let third: &i32 = &v[2];
    println!("第三個(gè)元素是 {}", third);
    
    match v.get(2) {
            Some(third) => println!("第三個(gè)元素是 {third}"),
            None => println!("去你的第三個(gè)元素,根本沒(méi)有!"),
        }
    }

    和其它語(yǔ)言一樣,集合類型的索引下標(biāo)都是從 0 開(kāi)始,&v[2] 表示借用 v 中的第三個(gè)元素。如果存在下標(biāo)越界的可能,那么建議使用get來(lái)獲取元素,否則還是使用下標(biāo)的方式會(huì)更好。

    重提內(nèi)存安全

    讓我們首先來(lái)回顧一下rust的所有權(quán)系統(tǒng)以及引用(借用)。

    所有權(quán)系統(tǒng)
    • Rust 中的每一個(gè)值都有一個(gè) 所有者(owner)。

    • 值在任一時(shí)刻有且只有一個(gè)所有者。

    • 當(dāng)所有者(變量)離開(kāi)作用域,這個(gè)值將被丟棄。

    引用規(guī)則
    • 同一作用域,一個(gè)變量只能有一個(gè)可變引用;

    • 在同一作用域,一個(gè)變量可以有多個(gè)不可變引用,不允許同時(shí)存在可變引用和不可變引用。

    現(xiàn)在,讓我們直接看下面這段代碼。

    rust的vector和hashmap怎么創(chuàng)建

    hashmap

    rust標(biāo)準(zhǔn)庫(kù)提供了hashmap,和其它語(yǔ)言的hashmap, map, object, dict等類似。

    創(chuàng)建hashmap

    use std::collections::HashMap;
    
    fn main() {
        // 創(chuàng)建一個(gè)HashMap,用于存儲(chǔ)寶石種類和對(duì)應(yīng)的數(shù)量
        let mut my_gems = HashMap::new();
    }

    HashMap 并沒(méi)有包含在 Rust 的 prelude 中,因此需要使用use來(lái)引入hashmap。通過(guò)new來(lái)創(chuàng)建一個(gè)hashmap。也可以有其它的方式來(lái)創(chuàng)建hashmap。例如:

    let target = [("A", 1), ("B", 2), ("C", 5), ("D", 8)];
    let target = HashMap::from(target);
    println!("{:?}", target);

    新增鍵值對(duì)

    使用insert方法即可新增鍵值對(duì)。例如:

    // 將寶石類型和對(duì)應(yīng)的數(shù)量寫(xiě)入表中
    my_gems.insert("紅寶石", 1);
    my_gems.insert("藍(lán)寶石", 2);
    my_gems.insert("河邊撿的誤以為是寶石的破石頭", 18);

    需要注意的是 HashMap 也是內(nèi)聚性的,即所有的 K 必須擁有同樣的類型,V 也是如此。跟 Vec 一樣,如果預(yù)先知道要存儲(chǔ)的 KV 對(duì)個(gè)數(shù),可以使用 HashMap::with_capacity(capacity) 創(chuàng)建指定大小的 HashMap,避免頻繁的內(nèi)存分配和拷貝,提升性能。

    根據(jù)鍵查詢值

    可以通過(guò)get方法來(lái)根據(jù)鍵名查詢值,不過(guò)get方法返回的是Option<&T>類型,需要使用unwrap來(lái)解析。例如:

    println!("{:?}", my_gems.get("紅寶石").unwrap());

    同時(shí)在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對(duì)應(yīng)的值,若不存在則插入新值
        let v = scores.entry("Yellow").or_insert(5);
        assert_eq!(*v, 5); // 不存在,插入5
    
        // 查詢Yellow對(duì)應(yīng)的值,若不存在則插入新值
        let v = scores.entry("Yellow").or_insert(50);
        assert_eq!(*v, 5); // 已經(jīng)存在,因此50沒(méi)有插入
    }

    hashmap提供了兩個(gè)方法,其中insert方法在沒(méi)有鍵值對(duì)的情況會(huì)進(jìn)行插入,有鍵值對(duì)的情況下進(jìn)行覆蓋;而or_insert方法在沒(méi)有鍵值對(duì)的情況下進(jìn)行插入,有鍵值對(duì)的情況下不插入。

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

    scores.remove("Blue");

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

    以上就是“rust的vector和hashmap怎么創(chuàng)建”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI