Rust學習——常見集合(Vec、String、HashMap)


一、vector
特點:一個挨着一個地存儲一系列數量可變的值。
只能存儲相同類型的值。
它在內存中彼此相鄰地排列所有的值。

常見場景:文件中的文本,購物車中商品的價格。

vector是用泛型實現的。
let v: Vec = Vec::new();

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

使用push方法更新值。
釋放vec時會丟棄其所有元素。

如何讀取vector元素值?

  1. 索引語法,即通過index訪問,類似數組
  2. get方法,返回一個Option<&T>,所以通過match運算符去處理。

第一種獲取元素的方法需要注意越位,會引起程序崩潰。即panic。
第二種則能很友好的在None的情況處理。

由於在同一作用域下不能同時存在可變和不可變引用,所以在獲取vector元素的不可變引用時嘗試在vector末尾增加元素,則會拋出異常。

在使用+=運算符之前必先用解引用運算符(*)獲取i中的值。

vector + 枚舉可以在vector中存放不同類型的數據。

二、字符串
特點:字符的集合。String。

let s = "initial contents".to_string();
// equal to
let s = String::from("initial contents");

Rust中字符串使用的是UTF-8編碼。

如何更新字符串?
1. push_str,該方法不會獲取到入參的所有權
2. push,該方法入參僅支持單個字符
3. + 運算符,String只能和&str 相加。
4. format! 宏,對於復雜的字符串處理,使用該方法最方便了,並且不會獲取任何參數的所有權

當把一個類型為String的字符串取引用,並與類型為String的字符串相加時,第一個類型會被Deref強制轉換成&str。

let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = format!("{}-{}-{}", s1, s2, s3);

Rust字符串String本質上是一個Vec 的封裝。

Rust中可以用三種方式可以理解字符串:

  1. 字節
  2. 標量值
  3. 字形簇(字母)

遍歷字符串的方法:
1. .chars()
2. .bytes()
3. 獲取字形簇可考慮crate.io上三方庫

三、hash map
特點:允許將值與一個特定的鍵key關聯,使用map數據結構。

生成一個map的方式:
use std::collections ::HashMap;
let mut scores = HashMap::new();

另一種方式:
use std::collections ::HashMap;

let teams = vec![String:: from("Blue"), String::from("Yellow")];
let initial_scores = vec![10, 50];
let scores: HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();

通過.get(key)方法可返回一個Option<&T>,所以通過match運算符去處理。

類似於 vector,hash map 是同質的:所有的鍵必須是相同類型,值也必須都是相同類型

hash map與所有權
如果將值的引用插入哈希 map,這些值本身將不會被移動進哈希 map。但是這些引用指向的值必須至少在哈希 map 有效時也是有效的。

更新hash map

  1. 覆蓋:
    1. 再次插入相同的key,即覆蓋
  2. 只在鍵無對應值時插入:
    1. 使用.entry(key).or_insert(value)方法
    2. 使用此方法可快速依據可迭代結構更新hash map,並獲取具體的鍵值
  3. 在舊值基礎上更新值:
    1. 將一個鍵值取出來后,使用*號解引用,然后進行賦值操作即可完成更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM