标准库——集合
Rust的标准集合都被存放在std::collections
模块中。
其中包括了:
- Sequences: Vec, VecDeque, LinkedList
- Maps: HashMap, BTreeMap
- Sets: HashSet, BTreeSet
- Misc: BinaryHeap
动态数组
Rust的动态数组类似于Java中的List。长度可变。动态数组是一种基于堆内存申请的连续动态数据类型,拥有 O(1) 时间复杂度的索引、压入(push)、弹出(pop)。
创建空Vec
new方法
let v: Vec<i32> = Vec::new();
使用宏创建空Vec
let v: Vec<i32> = vec![];
创建包含5个元素的Vec
let v = vec![1, 2, 3, 4, 5];
创建十个0
let v = vec![0; 10];
vector被销毁则元素也被销毁
vector中元素的什么周期与vector相同,也即vector被销毁时,其元素也会被销毁。
获取元素
[]或get()
let v = vec![1, 2, 3, 4, 5];
let third: &i32 = &v[2];
let third: Option<&i32> = v.get(2);
let does_not_exist = &v[100]; // 越界异常panic!
let does_not_exist = v.get(100); // 返回Option的NONE值
创建可变的Vec,并压入元素3
push方法
let mut v = vec![1, 2];
v.push(3);
创建拥有两个元素的Vec,并弹出一个元素
pop方法
let mut v = vec![1, 2];
let two = v.pop();
创建包含三个元素的可变Vec,并索引一个值和修改一个值
let mut v = vec![1, 2, 3];
let three = v[2]; // copy
v[1] = v[1] + 5;
这段代码可以运行,let three = v[2];
v[2]的值被copy给了three。
但如果是借用就会运行错误。如下:
let mut v = vec![1, 2, 3];
let three = &v[2]; // borrow then copy.
v[1] = v[1] + 5; // v has been borrowed.
因为mut变量不能在被借用的同时还被修改,所以,必须这样才可以:
let mut v = vec![1, 2, 3];
{
let three = &v[2]; // borrow then copy.
}
v[1] = v[1] + 5;
使用枚举,让vector可以容纳不同类型
由于vector是泛型的,所有vector一般只能填入一种类型。若需要同时存储多种类型的值,可以利用Rust的枚举的性质。
enum VectorValue {
Int(i32),
Float(f64),
Text(String),
}
// 拥有不同类型的vector
let row = vec![
VectorValue::Int(3),
VectorValue::Text(String::from("blue")),
VectorValue::Float(10.12),
];
HashMap
创建HashMap
use std::collections::HashMap;
let mut scores = HashMap::new();
insert
插入数据。
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
zip
拉链函数,将两个List中的元素配对成一个HashMap。
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();
其中HashMap<_, _>
表示HashMap接受任意类型的key与value。