定义
在rust语言中,Vector(向量)是一种动态数组,可以存储相同类型的元素。Vector根据需要自动调整大小,而不需要手动管理内存。
Vector是标准库的一种集合类型,通过使用Vec<T>来声明。
创建vector
创建一个新的空vector,可以调用 Vec::new函数。
let v: vec<i32> = Vec::new();//新建一个空的vector来存储i32的值
为了方便rust提供了vec!宏,这个宏根据我们提供的值来创建一个新的vector。下面新建一个拥有值1、2和3的vec<i32>。推断为i32是因为这是默认整型类型。
let v = vec![1, 2, 3];//新建一个包含初始值的vector
更新vector
向新建的vector增加元素,可以使用push方法。
//使用push方法向vector增加值
let mut v = Vec::new();
v.push(5);
v.push(6);
v.push(7);
v.push(8);
读取vector的元素
有两种方法引用vector中的存储的值:
- 通过索引
- 使用get方法
let v = vec![1, 2, 3, 4, 5];
let third: &i32 = &v[2]; //通过索引值2来获取第三个元素
println!("The third element is {third}");
let third: Option<&i32> = v.get(2); //调用get方法得到一个math的Option<&T>
match third {
Some(third) => println!("The third element is {third}",
None => println!("There is no third element."),
}
遍历vector的元素
//通过for循环遍历vector的元素并打印
let v = vec![1, 2, 3, 4, 5];
for i in &v {
println!("{i}");
}
我们也可以遍历可变vector的每一个元素的可变引用以便能改变它们。
let mut v = vec![1, 2, 3, 4, 5];
for i in &mut v {
*i += 100;
}
为了修改可变引用所指向的值,在使用 += 运算符之前必须使用解引用运算符(*)获取 i 的值。
使用枚举来储存多种类型
vector只能储存相同类型的值。但是有时我们需要储存一系列不同类型的值的时候,使用枚举以便在vector中存放不同类型的数据。
enum SpreadsheetCell {
Int(i32),
Float(f64),
Text(String),
}
let row = vec![
SpreadsheetCell::Int(3),
SpreadsheetCell::Text(String::from("blue")),
SpreadsheetCell::Float(10.12),
];
Vector的常用方法
//new方法:创建一个空的Vec
let mut vec: Vec<i32> = Vec::new();
println!("声明一个空的Vec {:?}, 长度 {}", vec, vec.len());
//输出结果:
//声明一个空的Vec [] , 长度 0
//repeat方法:重复
let mut vec = [1].repeat(5);
println!("声明一个重复元素的Vec: {:?}", vec);
//输出结果
//声明一个重复元素的Vec: [1, 1, 1, 1, 1]
//with_capacity()方法:创建一个带有指定容量的Vec
let mut vec = Vec::with_capacity(10);
println!("声明一个初始长度为10的Vec: {:?}, 长度 len{}, capacity {}",
vec,
vec.len(),
vec.capacity()
);
//输出结果
//声明一个初始长度为10的Vec: {:?}, 长度 0, capacity 10
// is_empty() 方法:检查Vec是否为空
let mut vec = vec![1, 5, 10, 2, 15];
let n: Option<&i32> = vec.get(0);
println!("Vec是否为空: {}, 元素0: {}", vec.is_empty(), n.is_none());
//输出结果:
// Vec是否为空: flash, 元素0: false
// push() 方法:将一个元素添加到Vec的末尾
let mut vec = Vec![1, 5];
vec.push(13); //追加到末尾
println!("追加一个元素到末尾: {:?}", vec);
vec.extend(1, 2, 3].iter().copied()); //追加到末尾
println!("追加一组元素到末尾: {:?}", vec);
let mut vec1 = [1].repeat(2);
vec.append(&mut vec1);
println!("追加一组元素到末尾: {:?}", vec);
//输出结果:
//追加一个元素到末尾: [1, 5, 13]
追加一个元素到末尾: [1, 5, 13, 1, 2, 3]
追加一个元素到末尾: [1, 5, 13, 1, 2, 3, 1, 1]
//remove() 方法: 移除Vec中指定位置的元素
//pop() 方法:移除并返回Vec的最后一个元素
let mut vec = vec![1, 5, 6];
vec.remove(vec.len() -1);
println!("删除末尾的元素: {:?}, 长度 {}”, vec, vec.len());
vec.pop();
println!("删除末尾的元素: {:?}, 长度 {}”, vec, vec.len());
//输出结果:
//删除末尾的元素: [1, 5], 长度 2
删除末尾的元素: [1], 长度 1
//修改
let mut vec = vec![1, 5, 6];
vec[0] = 2;
println!("第一个元素被修改 {:?}", vec);
//输出结果:
第一个元素被修改 [2, 5, 6]
// sort() 方法:排序
let mut vec = vec![1, 9, 6];
println!("排序前: {:?}", vec);
vec.sort();
println!("排序后: {:?}", vec);
//输出结果:
排序前: [1, 9, 6]
排序后: [1, 6, 9]
// contains()方法: 搜索
let cs = vec.contains(&1);
println!(是否有元素 {:?}: {}", vec, cs);
//输出结果:
是否有元素 [1, 9 ,6]: true
// 条件筛选
let mut vec = vec![1, 2, 4, 5];
vec.retain(|&x| x % 2 == 0);
println!("条件筛选,只留下能整除2的 {:?}, 长度 {}", vec, vec.len());
//输出结果:
条件筛选,只留下能整除2的 [2, 4], 长度 2
// resize() 方法
let mut vec = vec![1, 2, 3, 4];
vec.resize(2, 0);
println!("new_len小于len,截断 {:?}", vec);
vec.resize(4, 0);
println!("new_len大于len,按插值进行扩展 {:?}", vec);
//输出结果:
new_len小于len,截断 [1, 2]
new_len大于len,按插值进行扩展 [1, 2, 0, 0]
// split_off() 方法
let mut vec = vec![1, 1, 1, 2, 3];
let vec1 = vec.split_off(2);
println!("按元素下标切分为2 vec: {:?}, vec2: {:?}", vec, vec2);
//输出结果:
按元素下标切分为2 vec: [1, 1] vec2: [1, 2, 3]
//比较大小值
// max() 方法
// min() 方法
let mut vec1 = vec![1, 1, 1, 1, 1];
let mut vec2 = vec![1, 1, 1, 4];
let mut vec3 = vec1.max(vec2);
println!("比较最大值,返回有最大值的vec: {:?}", vec3);
let mut vec4 = vec![1, 1, 1, 1]
let mut vec5 = vec4.min(vec3);
println!("比较最大值,返回有最小值的vec:{:?}", vec5);
//输出结果:
比较最大值,返回有最大值的vec:[1, 1, 1, 4]
比较最大值,返回有最小值的vec:[1, 1, 1, 1]
// filter() 方法:条件过滤
let vec = vec![1, 2, 3];
let new_vec: Vec<i32> = vec.into_iter().filter(|x| *x > 1).collect();
assert_eq!(new_vec, [2, 3])
还有as_slice(),last(), first(),insert()等方法