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

Rust中vector的詳細(xì)用法

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

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

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

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

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

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

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

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

運(yùn)行結(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)建的同時(shí)傳入了元素,Rust 就可以根據(jù)插入的元素推斷出存放的類型。更常見的做法是使用初始值來創(chuàng)建一個(gè) Vec,而且為了方便 Rust 提供了 vec! 宏。這個(gè)宏會(huì)根據(jù)我們提供的值來創(chuàng)建一個(gè)新的 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); 
}

運(yùn)行結(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方法。下面我們來看一個(gè)具體的例子

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."),
    }
}

運(yùn)行結(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 有兩個(gè)引用元素的方法的原因是程序可以選擇如何處理當(dāng)索引值在 vector 中沒有對(duì)應(yīng)值的情況。

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

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

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

    let first = &v[0];

    v.push(6);

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

為什么第一個(gè)元素的引用會(huì)關(guān)心 vector 結(jié)尾的變化?不能這么做的原因是由于 vector 的工作方式:在 vector 的結(jié)尾增加新元素時(shí),在沒有足夠空間將所有所有元素依次相鄰存放的情況下,可能會(huì)要求分配新內(nèi)存并將老的元素拷貝到新的空間中。這時(shí),第一個(gè)元素的引用就指向了被釋放的內(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);
    }
}

運(yùn)行結(jié)果:

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

那么我們能不能遍歷的同時(shí)改變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);
}

運(yùn)行結(jié)果:

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

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

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

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

#[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);
}

上面我們借助枚舉來存儲(chǔ)一個(gè)學(xué)生的信息,包括年齡,性別,名字,對(duì)應(yīng)三種不同的數(shù)據(jù)類型。

六:vector學(xué)習(xí)總結(jié)

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

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

相關(guān)文章

  • rust使用Atomic創(chuàng)建全局變量和使用操作方法

    rust使用Atomic創(chuàng)建全局變量和使用操作方法

    從 Rust1.34 版本后,就正式支持原子類型,原子指的是一系列不可被 CPU 上下文交換的機(jī)器指令,這些指令組合在一起就形成了原子操作,這篇文章主要介紹了rust使用Atomic創(chuàng)建全局變量和使用,需要的朋友可以參考下
    2024-05-05
  • rust如何解析json數(shù)據(jù)舉例詳解

    rust如何解析json數(shù)據(jù)舉例詳解

    這篇文章主要給大家介紹了關(guān)于rust如何解析json數(shù)據(jù)的相關(guān)資料,SON 格式非常輕量級(jí),因此它非常適合在網(wǎng)絡(luò)中傳輸大量數(shù)據(jù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 使用Rust語言編寫一個(gè)ChatGPT桌面應(yīng)用示例詳解

    使用Rust語言編寫一個(gè)ChatGPT桌面應(yīng)用示例詳解

    這篇文章主要介紹了如何用Rust編寫一個(gè)ChatGPT桌面應(yīng)用,文中有詳細(xì)的流程介紹,對(duì)大家的學(xué)習(xí)或工作有意一定的幫助,需要的朋友可以參考下
    2023-05-05
  • Rust中print和println的區(qū)別實(shí)例解析

    Rust中print和println的區(qū)別實(shí)例解析

    Rust中print!和println!宏用于輸出,區(qū)別在于println!自動(dòng)換行,print!不換行,前者適用于同一行內(nèi)組合輸出,后者用于獨(dú)立日志或需換行場(chǎng)景,均支持格式化參數(shù),如{},本文給大家介紹Rust中print和println的區(qū)別,感興趣的朋友一起看看吧
    2025-06-06
  • Windows下Rust自定義路徑安裝全攻略【保姆級(jí)教程】

    Windows下Rust自定義路徑安裝全攻略【保姆級(jí)教程】

    Rust被設(shè)計(jì)為能夠處理大量的并發(fā)和高性能的軟件,這使得它適合在游戲開發(fā)、操作系統(tǒng)開發(fā)、瀏覽器引擎開發(fā)以及嵌入式系統(tǒng)等領(lǐng)域發(fā)揮巨大的作用,這篇文章主要介紹了Windows下Rust自定義路徑安裝的相關(guān)資料,需要的朋友可以參考下
    2026-02-02
  • Rust語言中的String和HashMap使用示例詳解

    Rust語言中的String和HashMap使用示例詳解

    這篇文章主要介紹了Rust語言中的String和HashMap使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 使用systemd部署r-nacos的操作方法

    使用systemd部署r-nacos的操作方法

    r-nacos是一個(gè)用rust實(shí)現(xiàn)的nacos服務(wù),我們用它平替java?nacos以降低服務(wù)占用內(nèi)存,提升服務(wù)的穩(wěn)定性,這篇文章主要介紹了使用systemd部署r-nacos,需要的朋友可以參考下
    2024-03-03
  • Rust中箱、包和模塊的學(xué)習(xí)筆記

    Rust中箱、包和模塊的學(xué)習(xí)筆記

    Rust中有三個(gè)重要的組織概念:箱、包、模塊,本文主要介紹了Rust中箱、包和模塊的學(xué)習(xí)筆記,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • 基于Rust構(gòu)建一個(gè)Git提交歷史可視化工具

    基于Rust構(gòu)建一個(gè)Git提交歷史可視化工具

    在軟件開發(fā)中,版本控制系統(tǒng)的歷史記錄往往承載著項(xiàng)目的演進(jìn)脈絡(luò),本文主要介紹了如何基于Rust構(gòu)建一個(gè)Git提交歷史可視化工具,感興趣的小伙伴可以了解下
    2025-11-11
  • Rust捕獲全局panic并記錄進(jìn)程退出日志的方法

    Rust捕獲全局panic并記錄進(jìn)程退出日志的方法

    本文提供了捕獲全局panic并記錄進(jìn)程退出日志的方法,首先使用 panic::set_hook 注冊(cè)異常處理及panic 觸發(fā)異常,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04

最新評(píng)論

咸丰县| 昭通市| 石狮市| 阿瓦提县| 奉化市| 河西区| 北辰区| 雷波县| 昌乐县| 黑山县| 洛扎县| 辉县市| 固原市| 宿迁市| 富蕴县| 化德县| 鲁山县| 洛川县| 塔河县| 阳春市| 隆子县| 临城县| 尚志市| 桃源县| 奇台县| 平山县| 昌吉市| 壶关县| 定州市| 宁河县| 张家川| 崇仁县| 安义县| 当阳市| 丽水市| 定远县| 泌阳县| 永川市| 驻马店市| 武宁县| 抚顺市|