1. 程式人生 > 其它 >Rust學習——常見集合(Vec、String、HashMap)

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. 將一個鍵值取出來後,使用*號解引用,然後進行賦值操作即可完成更新
學習是一條令人時而喜極若狂、時而鬱鬱寡歡的道路。