日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Rust 从入门到精通12-集合

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Rust 从入门到精通12-集合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Rust 標準庫中還提供了一系列被稱為 集合(collections)的數據結構,類似于JDK中 java.util 包下面的一些集合類(List/Set/Map等),這類集合指向的數據是存儲在堆上,意味著數據的數量不必在編譯期就已知,并且還能隨著程序的運行增大或縮小,每種集合都有其適用的場景,在我們日常開發過程中是非常有用的。

1、Vector

1.1 作用

由標準庫提供,用來存儲多個相同類型的值,其值在內存中是連續存放的。

相關 api 介紹:https://doc.rust-lang.org/std/vec/struct.Vec.html

1.2 創建

①、Vec::new 函數

fn main() {let v: Vec<i32> = Vec::new(); }

因為沒有向這個 vector 中插入任何值,Rust 并不知道我們想要儲存什么類型的元素,所以無法進行類型推斷,這里我們就增加了泛型<i32> ,表示這個集合 v 只能存放 i32 類型的數據。

②、vec![] 宏

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

這里我們提供了 i32 類型的初始值,Rust 可以推斷出 v 的類型是 Vec<i32>,因此不需要加上泛型注解。

1.3 添加

fn main() {let mut v: Vec<i32> = Vec::new();v.push(1);v.push(2); }

通過 push() 向集合末尾添加元素,注意要聲明為 mut 使其可變。

1.4 修改

直接通過下標的方式修改:

fn main() {let mut v: Vec<i32> = Vec::new();v.push(1);v.push(2);v[0] = 3; }

1.5 刪除

①、通過下標刪除

fn main() {let mut v: Vec<i32> = Vec::new();v.push(1);v.push(2);v.remove(0); }

②、刪除末尾元素

v.pop();

1.6 遍歷

fn main() {let mut v: Vec<i32> = vec![1,2,3,4];// 遍歷引用地址for x in &v{print!("{} ", x);}// 遍歷下標for x in 0..v.len(){if let Some(num) = v.get(x) {print!("{} ", num);}}for x in v.iter() {print!("{} ", x);}for x in v.into_iter() {print!("{} ", x);} }

1.7 遍歷修改

fn main() {let mut v: Vec<i32> = vec![1,2,3,4];for x in &mut v {*x += 1;}println!("&mut v {:?}", v);for x in v.iter_mut() {*x += 1;}println!("v.iter_mut {:?}", v);for x in 0..v.len() {if let Some(num) = v.get_mut(x) {*num += 1;}}println!("0..v.len() get_mut {:?}", v);let v1: Vec<i32> = v.iter().map(|x| x + 1).collect();println!("v.iter().map().collect() {:?}", v1);}

1.8 使用枚舉存儲不同類型

前面我們說vector 只能儲存相同類型的值,但實際會有很多情況下我們要存儲不同類型的值,這時候就可以使用枚舉。

因為枚舉成員都被定義為相同的枚舉類型。

fn main() {let row = vec![SpreadsheetCell::Int(3),SpreadsheetCell::Text(String::from("blue")),SpreadsheetCell::Float(10.12),]; }enum SpreadsheetCell {Int(i32),Float(f64),Text(String), }

2、HashMap

2.1 作用

基于 hash 算法的存儲一組鍵值對 (key- value- pair) 的容器,可以通過 K(任意類型)來尋找數據,而不是通過索引。

2.2 創建

注意必須首先通過 use 引用標準庫中集合部分的 HashMap。HashMap 沒有被 prelude 自動引用。

標準庫中對 HashMap 的支持也相對較少,例如,并沒有內建的構建宏。

use std::collections::HashMap; let mut map = HashMap::new();

PS:注意上面不指明 map 的類型,編譯是會報錯的。要么指明編譯類型 let mut map: HashMap<String,i32> = HashMap::new() ;要么通過類型推斷,像 map 中添加數據。

2.3 添加

fn main() {let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50); }

像 vector 一樣,哈希 map 將它們的數據儲存在堆上,這個 HashMap 的鍵類型是 String 而值類型是 i32。

類似于 vector,哈希 map 是同質的:所有的鍵必須是相同類型,值也必須都是相同類型。

2.4 修改

①、覆蓋一個值

用相同的鍵插入一個不同的值,也就是連續調用兩次 insert ,其 key 相同,value 不同。

fn main() {let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Blue"), 50);println!("{:?}", scores);//{"Blue": 50} }

②、key 不存在則插入,存在就不做操作

fn main() {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);//{"Blue": 10, "Yellow": 50} }

Entry 的 or_insert 方法在鍵對應的值存在時就返回這個值的可變引用,如果不存在則將參數作為新值插入并返回新值的可變引用。

③、key 不存在則插入,存在做更新操作

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

打印結果:

{“world”: 2, “hello”: 1, “wonderful”: 1}

由于Entry 的 or_insert 方法在鍵對應的值存在時會返回這個值的可變引用,我們通過 * 解引用然后去修改里面的值。

2.5 刪除

fn main() {let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"),50);scores.remove(&String::from("Yellow"));println!("{:?}", scores);//{"Blue": 10} }

2.6 遍歷

fn main() {let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"),50);println!("{:?}", scores);//{"Blue": 10}for (key, value) in &scores {println!("{}: {}", key, value);} }

總結

以上是生活随笔為你收集整理的Rust 从入门到精通12-集合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。