Rust學習——常見集合(Vec、String、HashMap)
一、vector
特點:一個挨著一個地儲存一系列數量可變的值。
只能儲存相同型別的值。
它在記憶體中彼此相鄰地排列所有的值。
常見場景:檔案中的文字,購物車中商品的價格。
vector是用泛型實現的。
let v: Vec
let v = vec![1, 2, 3,];
使用push方法更新值。
釋放vec時會丟棄其所有元素。
如何讀取vector元素值?
- 索引語法,即通過index訪問,類似陣列
- 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. .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
- 覆蓋:
- 再次插入相同的key,即覆蓋
- 只在鍵無對應值時插入:
- 使用.entry(key).or_insert(value)方法
- 使用此方法可快速依據可迭代結構更新hash map,並獲取具體的鍵值
- 在舊值基礎上更新值:
- 將一個鍵值取出來後,使用*號解引用,然後進行賦值操作即可完成更新