定义
在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()等方法