国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Rust常見集合

這篇具有很好參考價(jià)值的文章主要介紹了Rust常見集合。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

迄今為止,我們前面遇到的數(shù)據(jù)類型基本都是棧上存儲的。Rust 標(biāo)準(zhǔn)庫中包含一系列被稱為 集合collections)的非常有用的數(shù)據(jù)結(jié)構(gòu)。這些集合指向的數(shù)據(jù)是儲存在堆上的,這意味著數(shù)據(jù)的數(shù)量不必在編譯時(shí)就已知,并且還可以隨著程序的運(yùn)行增長或縮小。本篇我們將了解三個(gè)在 Rust 程序中被廣泛使用的集合:

  • vector 允許我們一個(gè)挨著一個(gè)地儲存一系列數(shù)量可變的值
  • 字符串string)是字符的集合。我們之前見過 String 類型,不過在本章我們將深入了解。
  • 哈希 maphash map)允許我們將值與一個(gè)特定的鍵(key)相關(guān)聯(lián)。這是一個(gè)叫做 map 的更通用的數(shù)據(jù)結(jié)構(gòu)的特定實(shí)現(xiàn)。

vector

我們要講到的第一個(gè)類型是 Vec<T>,也被稱為 vector。vector 允許我們在一個(gè)單獨(dú)的數(shù)據(jù)結(jié)構(gòu)中儲存多于一個(gè)的值,它在內(nèi)存中彼此相鄰地排列所有的值。vector 只能儲存相同類型的值。

vector的創(chuàng)建

新建一個(gè)空的vector:

let v: Vec<i32> = Vec::new();

為了方便 Rust 提供了 vec! 宏,這個(gè)宏會根據(jù)我們提供的字面值來創(chuàng)建一個(gè)新的 vector。

let v = vec![1, 2, 3];

增加元素

向vector增加元素:

fn main() {
    let mut v = Vec::new();

    v.push(5);
    v.push(6);
    v.push(7);
    v.push(8);
}

訪問元素

通過索引或使用 get 方法讀取vector里的元素:

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

    let third: &i32 = &v[2];
    println!("The third element is {third}");

    let third: Option<&i32> = v.get(2);
    match third {
        Some(third) => println!("The third element is {third}"),
        None => println!("There is no third element."),
    }
}

兩者區(qū)別是使用不合法的索引值會讓索引方式的代碼發(fā)生panic,而get方法因?yàn)槭欠祷匾粋€(gè)Option<&T>,所以只是返回一個(gè)None。

遍歷元素

使用for in遍歷vector:

fn main() {
    let v = vec![100, 32, 57];
    for i in &v {
        println!("{i}");
    }
}

或者在遍歷可變vector時(shí)進(jìn)行修改:

fn main() {
    let mut v = vec![100, 32, 57];
    for i in &mut v {
        *i += 50;
    }
}

使用枚舉存儲不同類型的數(shù)據(jù)

由于vector只能存儲同類型的數(shù)據(jù),對于不同類型的數(shù)據(jù),可以將它們跟枚舉值進(jìn)行關(guān)聯(lián),這樣vector就能存儲這些枚舉值。

元素的生命周期

丟棄vector的時(shí)候,也會丟棄其中的元素。

string

很多 Vec 可用的操作在 String 中同樣可用,事實(shí)上 String 被實(shí)現(xiàn)為一個(gè)帶有一些額外保證、限制和功能的字節(jié) vector 的封裝。

創(chuàng)建字符串

新建一個(gè)空字符串:

let mut s = String::new();

使用 to_string 方法從任何實(shí)現(xiàn)了 Display trait 的類型,比如字符串字面值,創(chuàng)建字符串:

fn main() {
    let data = "initial contents";

    let s = data.to_string();

    // 該方法也可直接用于字符串字面值:
    let s = "initial contents".to_string();
}

從字符串字面值創(chuàng)建:

let s = String::from("initial contents");

字符串或者字符的附加

可以通過 push_str 方法來附加字符串 slice,從而使 String 變長:

fn main() {
    let mut s = String::from("foo");
    s.push_str("bar");
}

通過push 方法來附加一個(gè)單獨(dú)的字符到string后面:

fn main() {
    let mut s = String::from("lo");
    s.push('l');
}

使用+來拼接字符串,需要注意這里使用的是引用:

fn main() {
    let s1 = String::from("tic");
    let s2 = String::from("tac");
    let s3 = String::from("toe");

    let s = s1 + "-" + &s2 + "-" + &s3;
}

使用 format! 宏格式化拼接字符串:

fn main() {
    let s1 = String::from("tic");
    let s2 = String::from("tac");
    let s3 = String::from("toe");

    let s = format!("{s1}-{s2}-{s3}");
}

不支持索引

Rust 的字符串不支持索引。使用下標(biāo)索引字符串可能發(fā)生錯(cuò)誤。

創(chuàng)建字符串slice

索引字符串通常是一個(gè)壞點(diǎn)子,因?yàn)樽址饕龖?yīng)該返回的類型是不明確的:字節(jié)值、字符、字形簇或者字符串 slice。因此,如果你真的希望使用索引創(chuàng)建字符串 slice 時(shí),Rust 會要求你更明確一些。為了更明確索引并表明你需要一個(gè)字符串 slice,相比使用 [] 和單個(gè)值的索引,可以使用 [] 和一個(gè) range 來創(chuàng)建含特定字節(jié)的字符串 slice:

#![allow(unused)]
fn main() {
let hello = "Здравствуйте";

let s = &hello[0..4];
}

里,s 會是一個(gè) &str,它包含字符串的頭四個(gè)字節(jié)。早些時(shí)候,我們提到了這些字母都是兩個(gè)字節(jié)長的,所以這意味著 s 將會是 “Зд”。而當(dāng)你訪問到了非字符邊界,你就會得到一個(gè)panic。

遍歷字符串

使用 chars 方法遍歷字符串的每個(gè)char:

#![allow(unused)]
fn main() {
for c in "Зд".chars() {
    println!("{c}");
}
}

bytes 方法返回每一個(gè)原始字節(jié):

#![allow(unused)]
fn main() {
for b in "Зд".bytes() {
    println!("");
}
}

HashMap

HashMap<K, V> 類型儲存了一個(gè)鍵類型 K 對應(yīng)一個(gè)值類型 V 的映射。它通過一個(gè) 哈希函數(shù)hashing function)來實(shí)現(xiàn)映射,決定如何將鍵和值放入內(nèi)存中。很多編程語言支持這種數(shù)據(jù)結(jié)構(gòu),不過通常有不同的名字:哈希、map、對象、哈希表或者關(guān)聯(lián)數(shù)組。

創(chuàng)建HashMap

可以使用 new 創(chuàng)建一個(gè)空的 HashMap,并使用 insert 增加元素:

fn main() {
    use std::collections::HashMap;

    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
}

訪問值

可以通過 get 方法并提供對應(yīng)的鍵來從哈希 map 中獲取值:

fn main() {
    use std::collections::HashMap;

    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);

    let team_name = String::from("Blue");
    let score = scores.get(&team_name).copied().unwrap_or(0);
}

get 方法返回 Option<&V>,如果某個(gè)鍵在哈希 map 中沒有對應(yīng)的值,get 會返回 None。程序中通過調(diào)用 copied 方法來獲取一個(gè) Option<i32> 而不是 Option<&i32>,接著調(diào)用 unwrap_orscore 中沒有該鍵所對應(yīng)的項(xiàng)時(shí)將其設(shè)置為零。

遍歷HashMap

可以使用與 vector 類似的方式來遍歷哈希 map 中的每一個(gè)鍵值對,也就是 for 循環(huán):

fn main() {
    use std::collections::HashMap;

    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);

    for (key, value) in &scores {
        println!("{key}: {value}");
    }
}

HashMap和所有權(quán)

對于像 i32 這樣的實(shí)現(xiàn)了 Copy trait 的類型,其值可以拷貝進(jìn)哈希 map。對于像 String 這樣擁有所有權(quán)的值,其值將被移動(dòng)而哈希 map 會成為這些值的所有者:

fn main() {
    use std::collections::HashMap;

    let field_name = String::from("Favorite color");
    let field_value = String::from("Blue");

    let mut map = HashMap::new();
    map.insert(field_name, field_value);
    // 這里 field_name 和 field_value 不再有效,
    // 嘗試使用它們看看會出現(xiàn)什么編譯錯(cuò)誤!
}

當(dāng) insert 調(diào)用將 field_namefield_value 移動(dòng)到哈希 map 中后,將不能使用這兩個(gè)綁定。

如果將值的引用插入哈希 map,這些值本身將不會被移動(dòng)進(jìn)哈希 map。但是這些引用指向的值必須至少在哈希 map 有效時(shí)也是有效的。

更新值

insert不僅可以插入一個(gè)鍵值對,還可以更新鍵值對。

map 有一個(gè)特有的 API,叫做 entry,它獲取鍵對應(yīng)的Entry。Entry代表了可能存在也可能不存在的值。Entryor_insert 方法在鍵對應(yīng)的值存在時(shí)就返回這個(gè)值的可變引用,如果不存在則將參數(shù)作為新值插入并返回新值的可變引用:

fn main() {
    use std::collections::HashMap;

    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);

    scores.entry(String::from("Yellow")).or_insert(50);
    scores.entry(String::from("Blue")).or_insert(50);

    println!("{:?}", scores);
}

or_insert 方法返回這個(gè)鍵的值的一個(gè)可變引用(&mut V)。這里我們將這個(gè)可變引用儲存在 count 變量中,所以為了賦值必須首先使用星號(*)解引用 count:

fn main() {
    use std::collections::HashMap;

    let text = "hello world wonderful world";

    let mut map = HashMap::new();

    for word in text.split_whitespace() {
        let count = map.entry(word).or_insert(0);
        *count += 1;
    }

    println!("{:?}", map);
}

參考:

常見集合 - Rust 程序設(shè)計(jì)語言 簡體中文版文章來源地址http://www.zghlxwxcb.cn/news/detail-726148.html

到了這里,關(guān)于Rust常見集合的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Rust語言從入門到入坑——(2)Rust在windows上搭建開發(fā)環(huán)境

    Rust語言從入門到入坑——(2)Rust在windows上搭建開發(fā)環(huán)境

    開始搭建一個(gè)適合在windows上運(yùn)行的Rust環(huán)境。 Rust支持的程序語言很多:可詳見官網(wǎng)介紹 本文章主要是在windowns下搭建開發(fā)環(huán)境 首先,需要安裝最新版的 Rust 編譯工具和 Visual Studio Code。 Rust 編譯工具:https://www.rust-lang.org/zh-CN/tools/install Visual Studio Code:https://code.visualstudio.com

    2024年02月09日
    瀏覽(24)
  • 簡單對比Java、Python、Go、Rust等常見語言計(jì)算斐波拉契數(shù)的性能

    簡單對比Java、Python、Go、Rust等常見語言計(jì)算斐波拉契數(shù)的性能

    最近簡單學(xué)了下Rust,以我這種菜鳥水平,沒感受到什么安全、性能什么方面的優(yōu)勢,只覺得概念太多,編譯各種報(bào)錯(cuò)。暫時(shí)也寫不出來什么玩法,索性對比下各種學(xué)過的語言的性能。部分語言很早之前學(xué)過,很久不用就忘了,所以是用GPT寫的。但運(yùn)行邏輯很簡單,所以應(yīng)該沒

    2024年03月16日
    瀏覽(25)
  • Rust軟件外包開發(fā)語言的特點(diǎn)

    Rust軟件外包開發(fā)語言的特點(diǎn)

    Rust 是一種系統(tǒng)級編程語言,強(qiáng)調(diào)性能、安全性和并發(fā)性的編程語言,適用于廣泛的應(yīng)用領(lǐng)域,特別是那些需要高度可靠性和高性能的場景。下面和大家分享 Rust 語言的一些主要特點(diǎn)以及適用的場合,希望對大家有所幫助。北京木奇移動(dòng)技術(shù)有限公司,專業(yè)的軟件外包開發(fā)公

    2024年02月12日
    瀏覽(23)
  • Rust之通用集合類型

    在Rust語言中包含了一系列被稱為集合的數(shù)據(jù)結(jié)構(gòu)。大部分的數(shù)據(jù)結(jié)構(gòu)都代表著某個(gè)特定的值,但集合卻可以包含多個(gè)值。與內(nèi)置的數(shù)組與元組類型不同,這些集合將自己持有的數(shù)據(jù)存儲在了堆上。這意味著數(shù)據(jù)的大小不需要在編譯時(shí)確定,并且可以隨著程序的運(yùn)行按需擴(kuò)大或

    2024年02月15日
    瀏覽(24)
  • Rust 常用集合(上)

    Rust 常用集合(上)

    目錄 1、使用 Vector 儲存列表 1.1?新建 vector 1.2?更新 vector 1.3?讀取 vector 的元素 1.4?遍歷 vector 中的元素 1.5?使用枚舉來儲存多種類型 1.6?丟棄 vector 時(shí)也會丟棄其所有元素 2、使用字符串儲存 UTF-8 編碼的文本 2.1?什么是字符串? 2.2?新建字符串 2.3?更新字符串 2.3.1?使用 pus

    2024年02月03日
    瀏覽(15)
  • 【rust語言】rust多態(tài)實(shí)現(xiàn)方式

    學(xué)習(xí)rust當(dāng)中遇到了這個(gè)問題,記錄一下,不對地方望指正 多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)中的一個(gè)重要概念,指同一個(gè)行為或操作在不同實(shí)例上具有不同的行為或結(jié)果。簡單來說,多態(tài)就是指同一種類型的對象,在不同的上下文中有不同的行為。多態(tài)性使得程序可以更加靈活、可

    2024年02月11日
    瀏覽(28)
  • 20天學(xué)會rust(四)常見系統(tǒng)庫的使用

    前面已經(jīng)學(xué)習(xí)了rust的基礎(chǔ)知識,今天我們來學(xué)習(xí)rust強(qiáng)大的系統(tǒng)庫,從此coding事半功倍。 在 Rust 中,有兩種主要的數(shù)組類型:固定長度數(shù)組(Fixed-size Arrays)和可變長度數(shù)組(Dynamic-size Arrays)。 固定長度數(shù)組(Fixed-size Arrays): 固定長度數(shù)組的長度在編譯時(shí)就確定,并且長度

    2024年02月13日
    瀏覽(14)
  • C語言和Rust語言的互相調(diào)用(2)(Rust調(diào)用C)

    1.創(chuàng)建項(xiàng)目 rust調(diào)用c方式挺多的,這里采用最通俗易懂的方法,用構(gòu)建腳本進(jìn)行構(gòu)建整個(gè)項(xiàng)目。 2.編輯build.rs的內(nèi)容 這里的build.rs:若要?jiǎng)?chuàng)建構(gòu)建腳本,我們只需在項(xiàng)目的根目錄下添加一個(gè) build.rs 文件即可。這樣一來, Cargo 就會先編譯和執(zhí)行該構(gòu)建腳本,然后再去構(gòu)建整個(gè)項(xiàng)

    2024年02月02日
    瀏覽(23)
  • 【Rust 基礎(chǔ)篇】Rust FFI:連接Rust與其他編程語言的橋梁

    Rust是一種以安全性和高效性著稱的系統(tǒng)級編程語言,具有出色的性能和內(nèi)存安全特性。然而,在現(xiàn)實(shí)世界中,我們很少有項(xiàng)目是完全用一種編程語言編寫的。通常,我們需要在項(xiàng)目中使用多種編程語言,特別是在與現(xiàn)有代碼庫或底層系統(tǒng)交互時(shí)。為了實(shí)現(xiàn)跨語言的互操作性,

    2024年02月15日
    瀏覽(29)
  • Rust 筆記:Rust 語言中的常量與變量

    Rust 筆記 Rust 語言中的常量與變量 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343 郵箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/130875912 【介紹】:本文介紹 Rust 語言中的常量與變量。 上一節(jié):《 上一節(jié)標(biāo)題 》 | 下一節(jié):《

    2024年02月06日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包