Common Collections
Common Collections
Vector
创建Vector
1  | let x: Vec<i32> = Vec::new();// 创建Vector  | 
添加元素
1  | // 添加元素  | 
删除Vector
当 Vector 离开作用域时会被删除
访问 Vector 中的元素
1.索引 data_name[index]
2.get data_name.get(index)
1  | let x = vec![1, 2, 3, 4];  | 
当 index 超出范围时
data_name[index] 会造成 panic
data_name.get(index) 会返回 None
Ownership
1  | let mut v = vec![1, 2, 3, 4, 5];  | 
记得Ownership 的特性吗? 不能同时有可变引用,和不可变引用
first 已经对 v 不可变引用, push 就不能操作了
可变引用的示例
1  | let mut v = vec![1, 2, 3, 4, 5];  | 
Vector + enum
Vector + enum 可以实现 Vector 存不同类型
1  | enum Kind {  | 
String
创建 String
1  | let mut x = String::new();  | 
添加元素
1  | x.push('A');  | 
to String
1  | // type -> String  | 
字符串拼接 +
1  | let s1 = String::from("20");  | 
format!
format! 拼接字符串 不会获得String的所有权
1  | let s1 = String::from("20");  | 
特性
String 不支持 [index] 访问元素
String len() 方法返回的是字节数,一般一个字母是一个字节
1  | let x = String::from("SCUT");  | 
回到字符串切片
1  | // 字符串切片只能沿着 char 边界切  | 
遍历
遍历 String
chars() 从字符角度
bytes() 从字节角度
1  | for x in y.chars() {  | 
HashMap
数据在 heap 上
不在 Prelude 中
同一个 HashMap 中 K 类型必须一样
创建
1  | let mut x: HashMap<String, i32> = HashMap::new();  | 
可以显示指明也可以编译器推断
添加元素
insert 方法,其返回 Option<T>
1  | x.insert(String::from("SCUT"), 2024);  | 
1  | // If the map did not have this key present, None is returned.  | 
访问元素
get 方法, 返回 Option<T>
1  | let mut map = HashMap::new();  | 
更新 HashMap
1  | // insert 插入时,如果对应的 key 存在,将替换对应的 val  | 
检查 key
contains_key 方法 返回 bool
1  | if map.contains_key(&k) {  | 
entry 方法 返回 enum Entry : 代表值是否存在
or_insert() 
如果 key 存在 返回 val 的可变引用
如果 key 不存在 插入后返回其可变引用
1  | let e = map.entry(&k);  | 
遍历
1  | for (k, v) in &map {  | 
Ownership
对于实现了 copy trait 的类型,值会被复制到 HahaMap
对于未实现 copy trait 的类型,其所有权会交给 HashMap
1  | let mut map = HashMap::new();  | 
1  | let mut map: HashMap<&String, &String> = HashMap::new();  | 
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GitSteve1025!

