RUST Collections
Rust 程序设计语言 - Rust 程序设计语言 简体中文版 (kaisery.github.io)
Collection
容器的数据存储在堆上,在运行时可以改变大小
Vector
Vec<T>
使用泛型实现了列表容器,其元素顺序存储且数据类型必须相同。
基本操作
- 使用
Vec::new()
创建一个vector对象,后续再给他添加值 - 使用
vec!
宏根据初始化数据创建一个vector对象 - 使用
push
添加元素 - 使用下标索引[index]获取元素
- 使用get函数获取
Option<&T>
,获取的Option可以用来判断是否越界访问,例如只有3个元素的vector,使用get(3)
,就会返回None
1 | let values : Vec<i32> = Vec::new(); // 需要使用类型注解Vec<i32>,告诉编译器类型 |
当对vector的第一个元素使用了不可变引用后,再对vector执行push方法,会提示vector已经被不可变引用了,不能再以可变引用的方式使用了。因为vector的元素连续存储,如果添加一个元素导致vector重新申请内存调整位置,之前引用的内存区域就会被释放了。
遍历Vector
使用for遍历一个vector其中的元素可以可变或不可变两种方式引用,因此不能在循环中修改vector的大小
1 | let mut v = vec![100, 32, 57]; |
enum元素
由于vector要求其中的元素类型必须相同,但可以使用枚举的方式扩展这种限制,因为同一个枚举中的变体可以有不同的类型。但是这种方法要求编译期就知道vector中元素的种类的占用的内存大小。
1 |
|
String
String
类型在rust标准库中定义是一个可扩大、可变、可拥有的UTF8编码的字串类型。
str
类型是在rust核心库中定义,用来表示字符串slice的utf8编码的字串,一般以引用&str
的方式使用
String
使用vector来实现Vec<u8>
基本操作
创建
1 | let mut s = String::new(); |
修改
使用push_str(&mut self, string: &str)
在字串后追加字串
使用push(&mut self, ch: char)
在字串后追加字符
使用+
操作符连接两个字符串,这个操作符本质上是fn add(self, s: &str) -> String
,他的第二个参数是一个字串切片,第一个参数没有&符号,所以会获取+号前的对象的所有权,同时把拼接后的字串的所有权返回出来,由于没有拷贝,所以效率会高一些。
对于复杂的字符串拼接,可以使用format!
宏,它不会获取变量的所有权
1 | let mut s1 = String::from("foo"); |
子串操作
rust的string不支持直接使用索引来获取一个字串中的字符,因为utf8字节流以vector的方式存储,取其中的一个字节出来一般不是预期的字符,为了避免预期外的错误,rust就不支持这种操作了。
可以使用区间操作获取一个字串切片&str
类型,但是需要保证切割的字节数刚好满足字符边界
1 | let hello = "Здравствуйте"; |
需要根据自己需要子串的数据类型选择合适的方法,例如要获取字符,使用chars()
,如果想获取字节数据使用bytes()
1 | let hello = "Здравствуйте"; |
Hash Map
HashMap<K, V>
使用hash函数计算一个键值在内存中的位置。同一个map要求所有key的类型相同,所有值的类型相同。可以修改hash函数算法,默认使用的是SipHash
基本操作
- 使用insert插入元素
- 使用get获取key对应的值,返回
Option<&V>
1 | use std::collections::HashMap; |
修改Map
分三种情况:
- 覆盖原有key对应的值
- 判断如果key不存在就添加,已经存在不处理
- 修改一个已经存在key的值
HashMap
的entry
方法以key
为参数返回一个Entry
类型的枚举,用来表示一个值是否存在。
1 | let mut scores = HashMap::new(); |