一、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,並獲取具體的鍵值
- 在舊值基礎上更新值:
- 將一個鍵值取出來后,使用*號解引用,然后進行賦值操作即可完成更新