欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Rust中向量的學(xué)習(xí)筆記

 更新時(shí)間:2024年03月14日 09:38:43   作者:希望_睿智  
在Rust語言中,向量是一種動(dòng)態(tài)數(shù)組類型,可以存儲(chǔ)相同類型的元素,并且可以在運(yùn)行時(shí)改變大小,本文就來介紹一下Rust中向量,感興趣的可以了解一下

概述

在Rust語言中,向量(Vector)是一種動(dòng)態(tài)數(shù)組類型,可以存儲(chǔ)相同類型的元素,并且可以在運(yùn)行時(shí)改變大小。向量是Rust標(biāo)準(zhǔn)庫(kù)中的一部分,位于std::vec模塊中。向量是一個(gè)非常靈活和強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),可以方便地用于各種場(chǎng)景,包括:存儲(chǔ)數(shù)據(jù)、處理集合、構(gòu)建動(dòng)態(tài)數(shù)組等。

向量的創(chuàng)建

向量類型由標(biāo)準(zhǔn)庫(kù)中的Vec<T>結(jié)構(gòu)體實(shí)現(xiàn),這里的T是類型參數(shù),代表向量能夠存儲(chǔ)任何類型的單個(gè)值,但所有元素必須是同一類型。Rust的向量是在堆上分配的,這意味著當(dāng)我們創(chuàng)建一個(gè)向量時(shí),它會(huì)在堆上分配內(nèi)存,而不是在棧上。因此,當(dāng)向量超出作用域時(shí),Rust會(huì)自動(dòng)釋放其占用的內(nèi)存,防止內(nèi)存泄漏。

在Rust中,創(chuàng)建向量主要有以下4種方法。

1、使用Vec::new創(chuàng)建空向量。

let mut vec_number: Vec<i32> = Vec::new();

2、使用vec!宏創(chuàng)建帶有初始值的向量。

fn main() {
    // 創(chuàng)建一個(gè)整數(shù)向量
    let vec_number: Vec<i32> = vec![66, 99, 100];
    println!("{:?}", vec_number);

    // 創(chuàng)建一個(gè)字符串向量
    let vec_str: Vec<String> = vec!["CSDN".to_string(), "GitHub".to_string()];
    println!("{:?}", vec_str);
}

3、使用vec!宏創(chuàng)建指定長(zhǎng)度,并初始化所有元素為相同值的向量。

fn main() {
    let vec_number: Vec<i32> = vec![0; 5];
    // 輸出:[0, 0, 0, 0, 0]
    println!("{:?}", vec_number);
}

4、使用Vec::with_capacity創(chuàng)建具有特定容量,但長(zhǎng)度為0的向量。

fn main() {
    // 創(chuàng)建一個(gè)初始為空,但足夠存儲(chǔ)5個(gè)整型元素的向量
    let mut vec_number: Vec<i32> = Vec::with_capacity(5);
    // 輸出:[]
    println!("{:?}", vec_number);
}

向量的訪問

訪問向量的元素,可以通過索引或迭代器進(jìn)行。

1、通過索引訪問。注意:Rust中的索引是基于0的,即第一個(gè)元素的索引是0,最后一個(gè)元素的索引是向量長(zhǎng)度減1。在Rust中使用索引訪問元素,沒有運(yùn)行時(shí)邊界檢查。如果索引超過邊界,會(huì)導(dǎo)致程序崩潰。為了更安全地使用索引訪問,避免因索引越界引發(fā)崩潰,可以使用get()方法或get_mut()方法,它返回一個(gè)Option<&T>或Option<&mut T>。

fn main() {
    let mut vec_number = vec![66, 99, 100];
    // 訪問第一個(gè)元素,輸出:66
    println!("{}", vec_number[0]);
    // 修改第二個(gè)元素
    vec_number[2] = 88;

    // 安全訪問,當(dāng)索引不存在時(shí),不會(huì)panic
    if let Some(value) = vec_number.get(2) {
        // 輸出:88
        println!("{}", value);
    } else {
        println!("out of bounds");
    }

    // 對(duì)可變引用的安全訪問,可修改向量中的元素
    let mut vec_mut = vec![1, 2, 3];
    if let Some(value) = vec_mut.get_mut(1) {
        *value = 1024;
    }

    // 輸出:[1, 1024, 3]
    println!("{:?}", vec_mut);
    
    // 獲取向量的長(zhǎng)度,輸出:3
    println!("{}", vec_mut.len());
    // 清空向量,并判斷向量是否為空
    vec_mut.clear();
    if vec_mut.is_empty() {
        println!("empty");
    } else {
        println!("not empty");
    }
}

2、通過迭代器訪問。迭代器(Iterator)是訪問向量元素的一種安全、高效且靈活的方式。通過迭代器可以遍歷向量中的所有元素,并對(duì)它們執(zhí)行操作,而無需關(guān)心具體的索引。iter()方法用于獲取只讀迭代器,iter_mut()方法用于獲取可寫迭代器,into_iter()方法用于消耗向量并迭代。

fn main() {
    let mut vec_str = vec!["CSDN", "GitHub", "Gitee"];

    // 使用for循環(huán)遍歷向量的所有元素
    for s in &vec_str {
        println!("{}", s);
    }
    
    // 使用iter()顯式獲取迭代器
    for s in vec_str.iter() {
        println!("{}", s);
    }
    
    // 若要修改元素,需使用iter_mut()獲得可變引用迭代器
    for s in vec_str.iter_mut() {
        if s.starts_with("C") {
            *s = "Rust";
        }
    }

    println!("{:?}", vec_str);
    
    for s in vec_str.into_iter() {
        println!("{}", s);
    }
    // 到這里時(shí),vec_str不再有效,因?yàn)樗呀?jīng)被消耗掉了
    // println!("{:?}", vec_str);
}

向量的修改

1、添加、移除元素。使用push方法可以將元素添加到向量的末尾,使用pop方法可以從向量的末尾移除元素并返回該元素。

fn main() {
    let mut vec_number = vec![10, 20];
    vec_number.push(66);
    // 輸出:[10, 20, 66]
    println!("{:?}", vec_number);

    let last_number = vec_number.pop();
    // 輸出:66
    if let Some(value) = last_number {
        println!("{}", value);
    } else {
        println!("no data");
    }
    
    // 輸出:[10, 20]
    println!("{:?}", vec_number);
}

2、插入、刪除元素。insert)方法用于將元素插入到指定索引位置,原有位置及之后的元素都會(huì)右移。remove()方法用于刪除并返回指定索引位置的元素,之后的元素會(huì)左移填補(bǔ)空位。注意:插入和刪除操作可能導(dǎo)致向量?jī)?nèi)部需要重新分配內(nèi)存以適應(yīng)大小的變化,這可能涉及到元素的移動(dòng);因此,對(duì)于大型數(shù)據(jù)集或性能敏感的應(yīng)用,這些操作可能會(huì)有較高的時(shí)間開銷。

fn main() {
    let mut vec_number = vec![10, 20];
    // 插入元素
    vec_number.insert(1, 66);
    // 輸出:[10, 66, 20]
    println!("{:?}", vec_number);

    // 刪除元素
    vec_number.remove(0);
    // 輸出:[66, 20]
    println!("{:?}", vec_number);
}

向量的切片

Rust的向量支持切片操作,這意味著,我們可以獲取向量的一部分作為新的向量。切片是通過指定起始索引和結(jié)束索引來創(chuàng)建的,注意:包括起始索引的元素,但不包括結(jié)束索引的元素。

fn main() {
    let mut vec_number = vec![10, 20, 30, 40, 50];

    // 獲取一個(gè)切片,從索引2到4(不包括4)
    let slice = &mut vec_number[2..4];
    // 輸出:[30, 40]
    println!("{:?}", slice);

    // 修改切片中的元素
    for item in slice.iter_mut() {
        *item *= 2;
    }

    // 輸出:[60, 80]
    println!("{:?}", slice);
}

向量的排序

Rust的向量可以通過sort()方法或sort_unstable()來進(jìn)行排序,還可以通過sort_by()方法或sort_unstable_by()方法根據(jù)自定義的比較邏輯來進(jìn)行排序。sort()方法是穩(wěn)定的排序算法,即相同元素的相對(duì)順序不會(huì)改變。sort_unstable()方法是不穩(wěn)定的排序算法,意味著相同的元素可能會(huì)改變相對(duì)順序,但總體上會(huì)按照給定的排序規(guī)則排序。

fn main() {
    let mut vec_number = vec![7, 88, 12, 36, 50];

    // 默認(rèn)為升序排序
    vec_number.sort_unstable(); 
    // 輸出:[7, 12, 36, 50, 88]
    println!("{:?}", vec_number);

    // 顯式指定排序規(guī)則,仍然是升序
    vec_number.sort_by(|a, b| a.cmp(b));

    // 輸出: [7, 12, 36, 50, 88]
    println!("{:?}", vec_number);

    // 若要降序排序,反轉(zhuǎn)比較結(jié)果
    vec_number.sort_unstable_by(|a, b| b.cmp(a));
    // 輸出: [88, 50, 36, 12, 7]
    println!("{:?}", vec_number);
}

向量的擴(kuò)展和收縮

在Rust中,向量提供了幾種方法來管理其容量和大小。容量是向量在內(nèi)存中為元素預(yù)留的空間大小,而大小則是向量當(dāng)前實(shí)際包含的元素?cái)?shù)量。當(dāng)添加元素到向量時(shí),如果當(dāng)前容量不足,向量可能會(huì)自動(dòng)增長(zhǎng)其容量。但這并不意味著當(dāng)我們刪除元素時(shí),向量會(huì)自動(dòng)縮小其容量。

以下是向量中用于管理容量的幾個(gè)方法。

1、resize方法用于改變?nèi)萘康拇笮?。如果新的大小大于?dāng)前大小,向量會(huì)在末尾添加默認(rèn)值(對(duì)于整數(shù)類型,通常是0;對(duì)于其他類型,則依賴于其默認(rèn)構(gòu)造函數(shù))。如果新的大小小于當(dāng)前大小,向量會(huì)丟棄末尾的多余元素。

fn main() {
    let mut vec_number = vec![10, 20, 30];
    // 向量為[10, 20, 30, 0, 0],大小為5,容量可能增長(zhǎng)以容納更多元素
    vec_number.resize(5, 0);
    println!("{:?}", vec_number);

    // 向量為[10, 20],大小為2,但容量可能仍然大于2
    vec_number.resize(2, 0);
    println!("{:?}", vec_number);
}

2、reserve方法用于確保向量至少有足夠的容量來存儲(chǔ)指定數(shù)量的元素,而不會(huì)重新分配。如果當(dāng)前容量小于所需容量,向量會(huì)分配更多內(nèi)存,這不會(huì)改變向量的大小。

fn main() {
    let mut vec_number = vec![10, 20, 30];
    // 確保vec至少有20的容量,但不改變其大小和內(nèi)容
    vec_number.reserve(20);
    // 輸出:[10, 20, 30]
    println!("{:?}", vec_number);
}

3、shrink_to_fit方法嘗試將向量的容量減少到與其大小相同。這通常在我們確定不再需要額外容量,并且希望減少內(nèi)存使用時(shí)很有效。注意:這個(gè)方法并不保證一定能減少容量,某些情況下,出于性能或?qū)崿F(xiàn)的原因,向量可能會(huì)保留一些額外的容量。

fn main() {
    let mut vec_number = vec![10, 20, 30];
    // 將容量增加到10
    vec_number.reserve(10);
    // 刪除一個(gè)元素,現(xiàn)在大小是2,但容量可能仍然是10
    vec_number.pop();
    // 嘗試將容量減少到2
    vec_number.shrink_to_fit();
    println!("{}", vec_number.capacity());
}

注意:在使用上述這些方法時(shí),我們應(yīng)該考慮性能開銷和內(nèi)存使用之間的權(quán)衡。頻繁地調(diào)整向量的容量可能會(huì)導(dǎo)致不必要的性能開銷,因此在確定確實(shí)需要調(diào)整容量時(shí),才應(yīng)該使用這些方法。

向量的連接和合并

在Rust中,如果想要連接或合并多個(gè)集合,可以使用extend方法,或者利用迭代器的collect方法。在下面的示例代碼中,我們使用extend方法后,vec2被轉(zhuǎn)移了所有權(quán),已經(jīng)無效了。collect方法通常與迭代器一起使用,用于將迭代器中的元素收集到一個(gè)集合中。

fn main() {
    let mut vec1 = vec![1, 2, 3];
    let vec2 = vec![4, 5, 6];
    
    // 將vec2的內(nèi)容添加到vec1末尾
    vec1.extend(vec2);
    // 輸出:[1, 2, 3, 4, 5, 6]
    println!("{:?}", vec1);
    // vec2被extend函數(shù)轉(zhuǎn)移了所有權(quán),到這里時(shí)無效了
    // println!("{:?}", vec2);
    
    // 創(chuàng)建一個(gè)新的向量來包含兩個(gè)向量的內(nèi)容
    let vec3 = vec![1, 2, 3];
    let vec4 = vec![4, 5, 6];
    let vec5: Vec<i32> = vec3.into_iter().chain(vec4).collect();
    // 輸出:[1, 2, 3, 4, 5, 6]
    println!("{:?}", vec5);
}

到此這篇關(guān)于Rust中向量的學(xué)習(xí)筆記的文章就介紹到這了,更多相關(guān)Rust 向量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust anyhow 簡(jiǎn)明示例教程

    Rust anyhow 簡(jiǎn)明示例教程

    anyhow 是 Rust 中的一個(gè)庫(kù),旨在提供靈活的、具體的錯(cuò)誤處理能力,建立在 std::error::Error 基礎(chǔ)上,主要用于那些需要簡(jiǎn)單錯(cuò)誤處理的應(yīng)用程序和原型開發(fā)中,本文給大家分享Rust anyhow 簡(jiǎn)明教程,一起看看吧
    2024-06-06
  • Rust之Rhai腳本編程的示例

    Rust之Rhai腳本編程的示例

    文章介紹了如何在Rust中使用Rhai庫(kù)執(zhí)行腳本,包括添加依賴、創(chuàng)建引擎、定義腳本、執(zhí)行腳本并處理結(jié)果,示例展示了如何定義一個(gè)簡(jiǎn)單的函數(shù)并調(diào)用它,輸出問候信息
    2025-02-02
  • 在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析

    在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析

    在Rust中,Struct和Enum是組織數(shù)據(jù)的核心工具,Struct用于將相關(guān)字段封裝為單一實(shí)體,便于管理和擴(kuò)展,Enum用于明確定義所有可能的狀態(tài),本文將通過具體示例,深入探討為什么在Rust中必須使用struct和enum來管理數(shù)據(jù),感興趣的朋友一起學(xué)習(xí)吧
    2025-02-02
  • Rust語言中級(jí)教程之指針

    Rust語言中級(jí)教程之指針

    Rust中共有三種類型的指針,分別為引用,解引用,智能指針,這篇文章主要介紹了Rust語言中級(jí)教程之指針,需要的朋友可以參考下
    2023-05-05
  • Rust文件 launch.json作用大全

    Rust文件 launch.json作用大全

    launch.json 是 Visual Studio Code(VSCode)中的一個(gè)配置文件,主要用于配置調(diào)試器,本文給大家介紹Rust文件 launch.json 有什么用,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • 深入探究在Rust中函數(shù)、方法和關(guān)聯(lián)函數(shù)有什么區(qū)別

    深入探究在Rust中函數(shù)、方法和關(guān)聯(lián)函數(shù)有什么區(qū)別

    在 Rust 中,函數(shù)、方法和關(guān)聯(lián)函數(shù)都是用來封裝行為的,它們之間的區(qū)別主要在于它們的定義和調(diào)用方式,本文將通過一個(gè)簡(jiǎn)單的rust代碼示例來給大家講講Rust中函數(shù)、方法和關(guān)聯(lián)函數(shù)區(qū)別,需要的朋友可以參考下
    2023-08-08
  • Rust中的Copy和Clone對(duì)比分析

    Rust中的Copy和Clone對(duì)比分析

    這篇文章主要介紹了Rust中的Copy和Clone及區(qū)別對(duì)比分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Rust中的Cargo構(gòu)建、運(yùn)行、調(diào)試

    Rust中的Cargo構(gòu)建、運(yùn)行、調(diào)試

    Cargo是rustup安裝后自帶的,Cargo?是?Rust?的構(gòu)建系統(tǒng)和包管理器,這篇文章主要介紹了Rust之Cargo構(gòu)建、運(yùn)行、調(diào)試,需要的朋友可以參考下
    2022-09-09
  • 深入了解Rust中trait的使用

    深入了解Rust中trait的使用

    先前我們提到過?trait,那么Rust中的trait?是啥呢?本文將通過一些示例為大家詳細(xì)講講Rust中trait的使用,感興趣的小伙伴可以了解一下
    2022-11-11
  • Rust并發(fā)編程之使用消息傳遞進(jìn)行線程間數(shù)據(jù)共享方式

    Rust并發(fā)編程之使用消息傳遞進(jìn)行線程間數(shù)據(jù)共享方式

    文章介紹了Rust中的通道(channel)概念,包括通道的基本概念、創(chuàng)建并使用通道、通道與所有權(quán)、發(fā)送多個(gè)消息以及多發(fā)送端,通道提供了一種線程間安全的通信機(jī)制,通過所有權(quán)規(guī)則確保數(shù)據(jù)安全,并且支持多生產(chǎn)者單消費(fèi)者架構(gòu)
    2025-02-02

最新評(píng)論