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!