亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Rust中vector的詳細用法

 更新時間:2024年03月14日 11:30:02   作者:ftzchina  
Rust和C++同樣也有vector概念,本文主要介紹了Rust中vector的詳細用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

用過C++的相信對vector概念不陌生了,C++中我們稱vector為容器,它能夠像容器一樣存放各種類型的對象。Rust中同樣也有vector概念,在Rust中vector 允許我們在一個單獨的數(shù)據(jù)結(jié)構(gòu)中儲存多個值,所有值在內(nèi)存中彼此相鄰排列,在內(nèi)存中的存儲形式和數(shù)組一樣,vector 只能儲存相同類型的值。但是借助另一種結(jié)構(gòu)(枚舉),我們可以用vector存儲不同類型的值,當然這是包了一層,下面我們講一下Rust的vector詳細用法。

一:vector的實例創(chuàng)建

fn main() {
    let vec_ins:Vec<u32> = Vec::new();
}

上面我們通過Vec的new函數(shù)創(chuàng)建了一個vector實例,并指定了其里面存儲的值是u32類型,那我們用new創(chuàng)建的時候能不能不指定值類型呢。

這是不允許的,如果用new創(chuàng)建的時候不指定類型,那么因為沒有向這個 vector 中插入任何值,Rust 并不知道我們想要儲存什么類型的元素。這一點非常重要。vector 是用泛型實現(xiàn)的,第 10 章會涉及到如何對你自己的類型使用它們?,F(xiàn)在,我們知道 Vec 是一個由標準庫提供的類型,它可以存放任何類型,而當 Vec 存放某個特定類型時,那個類型位于尖括號中。        

那假如我在創(chuàng)建的同時,傳入vector的元素,是不是就意味著不用顯示的指定類型。

fn main() {
    let vec_ins = vec![1, 2, 3];
    println!("vec is {:?}",vec_ins); 
}

運行結(jié)果:

PS F:\skillup\rust\hello_world\greeting> cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target\debug\greeting.exe`
vec is [1, 2, 3]

vector創(chuàng)建的同時傳入了元素,Rust 就可以根據(jù)插入的元素推斷出存放的類型。更常見的做法是使用初始值來創(chuàng)建一個 Vec,而且為了方便 Rust 提供了 vec! 宏。這個宏會根據(jù)我們提供的值來創(chuàng)建一個新的 Vec。

二:vector的元素插入

我們創(chuàng)建了vector,那么如何向vector中插入元素。

fn main() {
    let mut vec_ins:Vec<char> = Vec::new();
    vec_ins.push('f');
    vec_ins.push('t');
    vec_ins.push('z');
    println!("vec is {:?}",vec_ins); 
}

運行結(jié)果:

PS F:\skillup\rust\hello_world\greeting> cargo run
   Compiling greeting v0.1.0 (F:\skillup\rust\hello_world\greeting)
    Finished dev [unoptimized + debuginfo] target(s) in 1.19s
     Running `target\debug\greeting.exe`
vec is ['f', 't', 'z']

Rust中可以使用 push 方法往vector中插入元素

三:vector的元素讀取

在Rust中我們有兩種方法來獲取vector中元素的值,一是通過索引,二是通過get方法。下面我們來看一個具體的例子

fn main() {
    let mut vec_ins:Vec<char> = Vec::new();
    vec_ins.push('f');
    vec_ins.push('t');
    vec_ins.push('z');
    println!("vec is {:?}",vec_ins); 

    let second_ele= vec_ins[1];
    println!("the second element is {}",second_ele); 

    match vec_ins.get(1) {
        Some(second_ele) => println!("The second element is {}", second_ele),
        None => println!("There is no second element."),
    }
}

運行結(jié)果:

S F:\skillup\rust\hello_world\greeting> cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target\debug\greeting.exe`
vec is ['f', 't', 'z']
the second element is t
The second element is t

Rust 有兩個引用元素的方法的原因是程序可以選擇如何處理當索引值在 vector 中沒有對應值的情況。

當引用一個不存在的元素時 Rust 會造成 panic。這個方法更適合當程序認為嘗試訪問超過 vector 結(jié)尾的元素是一個嚴重錯誤的情況,這時應該使程序崩潰。比如vector總共有5個元素,你用下標去獲取第6個元素,就是越界訪問,這時候程序就panic了,當 get 方法被傳遞了一個數(shù)組外的索引時,它不會 panic 而是返回 None。當偶爾出現(xiàn)超過 vector 范圍的訪問屬于正常情況的時候可以考慮使用它。接著你的代碼可以有處理 Some(&element) 或 None 的邏輯。例如,索引可能來源于用戶輸入的數(shù)字。如果它們不慎輸入了一個過大的數(shù)字那么程序就會得到 None 值,你可以告訴用戶當前 vector 元素的數(shù)量并再請求它們輸入一個有效的值。這就比因為輸入錯誤而使程序崩潰要友好的多!

一旦程序獲取了一個有效的引用,借用檢查器將會執(zhí)行所有權(quán)和借用規(guī)則來確保 vector 內(nèi)容的這個引用和任何其他引用保持有效。不能在相同作用域中同時存在可變和不可變引用的規(guī)則。當我們獲取了 vector 的第一個元素的不可變引用并嘗試在 vector 末尾增加一個元素的時候,這是行不通的:

fn main() {
    let mut v = vec![1, 2, 3, 4, 5];

    let first = &v[0];

    v.push(6);

    println!("The first element is: {}", first);
}

為什么第一個元素的引用會關(guān)心 vector 結(jié)尾的變化?不能這么做的原因是由于 vector 的工作方式:在 vector 的結(jié)尾增加新元素時,在沒有足夠空間將所有所有元素依次相鄰存放的情況下,可能會要求分配新內(nèi)存并將老的元素拷貝到新的空間中。這時,第一個元素的引用就指向了被釋放的內(nèi)存。借用規(guī)則阻止程序陷入這種狀況。

四:vector的元素遍歷

 我們可以用for循環(huán)來遍歷vector元素

fn main() {
    let mut vec_ins:Vec<char> = Vec::new();
    vec_ins.push('f');
    vec_ins.push('t');
    vec_ins.push('z');
    println!("vec is {:?}",vec_ins); 

    for i in &vec_ins{
        println!("the element is {}",i);
    }
}

運行結(jié)果:

vec is ['f', 't', 'z']
the element is f
the element is t
the element is z

那么我們能不能遍歷的同時改變vector元素的值呢

fn main() {
    let mut vec_ins:Vec<char> = Vec::new();
    vec_ins.push('f');
    vec_ins.push('t');
    vec_ins.push('z');
    println!("vec is {:?}",vec_ins); 

    for i in &mut vec_ins{
        *i = 'x'
    }
    println!("the element is {:?}",vec_ins);
}

運行結(jié)果:

vec is ['f', 't', 'z']
the element is ['x', 'x', 'x']

為了修改可變引用所指向的值,在使用 = 運算符之前必須使用解引用運算符(*)獲取 i 中的值

五:vector借助枚舉來存儲不同類型的值

上面講到vector 只能儲存相同類型的值。如果有這個限制vector說實話和數(shù)組功能就相差無幾了。何謂道高一尺,魔高一丈,很幸運的是vector絕對有能力做到存儲不同類型的值,不過要借助另外一個結(jié)構(gòu),枚舉的成員都被定義為相同的枚舉類型,所以當需要在 vector 中儲存不同類型值時,我們可以定義并使用一個枚舉!

#[derive(Debug)]
enum Student {
    Age(i32),
    Sex(char),
    Name(String),
}
fn main() {
    let student = vec![
        Student::Age(18),
        Student::Sex('男'),
        Student::Name(String::from("ftz"))
    ];
    println!("The student is {:?}",student);
}

上面我們借助枚舉來存儲一個學生的信息,包括年齡,性別,名字,對應三種不同的數(shù)據(jù)類型。

六:vector學習總結(jié)

Rust 在編譯時就必須準確的知道 vector 中類型的原因在于它需要知道儲存每個元素到底需要多少內(nèi)存。第二個好處是可以準確的知道這個 vector 中允許什么類型。如果 Rust 允許 vector 存放任意類型,那么當對 vector 元素執(zhí)行操作時一個或多個類型的值就有可能會造成錯誤。使用枚舉外加 match 意味著 Rust 能在編譯時就保證總是會處理所有可能的情況。

到此這篇關(guān)于Rust中vector的詳細用法的文章就介紹到這了,更多相關(guān)Rust vector內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust 語言中的 into() 方法及代碼實例

    Rust 語言中的 into() 方法及代碼實例

    在 Rust 中,into() 方法通常用于將一個類型的值轉(zhuǎn)換為另一個類型,這通常涉及到資源的所有權(quán)轉(zhuǎn)移,本文給大家介紹Rust 語言中的 into() 方法及代碼實例,感謝的朋友跟隨小編一起看看吧
    2024-03-03
  • Rust中用enum實現(xiàn)多參數(shù)Hook機制完整代碼

    Rust中用enum實現(xiàn)多參數(shù)Hook機制完整代碼

    在 Rust 中,如果想為enum實現(xiàn)一個帶多參數(shù)的 Hook 機制,可以結(jié)合模式匹配和枚舉來處理,這種方式可以擴展到支持不同類型的輸入?yún)?shù)和邏輯處理,下面通過示例代碼介紹Rust中用enum實現(xiàn)多參數(shù)Hook機制,感興趣的朋友一起看看吧
    2024-12-12
  • 一文詳解Rust中的錯誤處理

    一文詳解Rust中的錯誤處理

    這篇文章主要為大家詳細介紹了Rust中的錯誤處理的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • Rust?中?Mutex?的基本用法

    Rust?中?Mutex?的基本用法

    Rust?標準庫中的?Mutex?結(jié)構(gòu)體位于?std::sync::Mutex?中,它提供了線程安全的數(shù)據(jù)訪問,Mutex?保證了在同一時間只有一個線程可以訪問被鎖定的數(shù)據(jù),這篇文章主要介紹了Rust?中?Mutex?的基本用法,需要的朋友可以參考下
    2024-05-05
  • Rust生命周期常見誤區(qū)(中英對照)全面指南

    Rust生命周期常見誤區(qū)(中英對照)全面指南

    這篇文章主要WEIDJAI?介紹了Rust生命周期常見誤區(qū)(中英對照)的全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 一文學會Rust語言如何操作JSON

    一文學會Rust語言如何操作JSON

    JSON在Web開發(fā)中被廣泛應用于數(shù)據(jù)交換,本文主要介紹了Rust語言操作JSON,包括序列化、反序列化、JSON創(chuàng)建等多個方面,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Rust利用tauri制作個效率小工具

    Rust利用tauri制作個效率小工具

    日常使用電腦中經(jīng)常會用到一個quicke工具中的輪盤菜單工具。但quicke免費版很多功能不支持,且它的觸發(fā)邏輯用的不舒服,經(jīng)常誤觸。所以本文就來用tauri自制一個小工具,希望對大家有所幫助
    2023-02-02
  • Rust使用csv crate構(gòu)建CSV文件讀取器的全過程

    Rust使用csv crate構(gòu)建CSV文件讀取器的全過程

    這篇文章主要學習如何基于Rust使用csv這個crate構(gòu)建一個CSV文件讀取器的過程,學習了csv相關(guān)的用法以及一些往期學過的crate的復習,兼顧了實用性和Rust的學習,需要的朋友可以參考下
    2024-05-05
  • Rust中的Drop特性之解讀自動化資源清理的魔法

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

    Rust通過Drop特性實現(xiàn)了自動清理機制,確保資源在對象超出作用域時自動釋放,避免了手動管理資源時可能出現(xiàn)的內(nèi)存泄漏或雙重釋放問題,智能指針如Box、Rc和RefCell都依賴于Drop來管理資源,提供了靈活且安全的資源管理方案
    2025-02-02
  • 深入了解Rust?結(jié)構(gòu)體的使用

    深入了解Rust?結(jié)構(gòu)體的使用

    結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,它允許我們將多個不同的類型組合成一個整體。下面我們就來學習如何定義和使用結(jié)構(gòu)體,并對比元組與結(jié)構(gòu)體之間的異同,需要的可以參考一下
    2022-11-11

最新評論