1.Vec定义
1.1 向量是可调整大小的数组,可用于动态存储元素序列的数据结构。要求存储的元素必须具有相同的类型。如果需要存储不用类型,可以选择使用带有多个变量的枚举作为在向量中存储不同类型元素的方法。
1.2 在rust中,vector用三个参数表示,指向堆内存的指针地址,长度以及容量。这些参数保存在一个结构体中。
创建一个向量和如果向向量里面添加值
//定义一个容量为6的空向量,这时向量的长度为0
let mut vec: Vec<i32> = Vec::with_capacity(6);
//添加第一个元素,此时长度为1
vec.push(1);
//添加第二个元素,长度加1
vec.push(2);
示意图
输出这个向量:
println!("包含的元素: {:?}", vec);
println!("向量的长度: {:?}", vec.len());
println!("向量的容量: {:?}", vec.capacity());
println!("第一个元素的值:{:?}",vec[0]);
如果此时想输出空元素的值,则会中断退出,因为向量只是预申请了那块内存,并不拥有那块内存:
println!("第6个元素的值:{:?}",vec[5]);
thread 'main' panicked at 'index out of bounds: the len is 2 but the index is 5', src/main.rs:53:35
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
向当前向量添加超过预申请的内存,原本预申请了6个元素的内存,当添加的元素超过预申请的内存时,rust又按6个为单位再申请一块内存,此时的容量为12:
let mut vec: Vec<i32> = Vec::with_capacity(6);
vec.push(1);
vec.push(2);
vec.append(vec![3,4,5,6,7].borrow_mut());
println!("包含的元素: {:?}", vec);
println!("向量的长度: {:?}", vec.len());
println!("向量的容量: {:?}", vec.capacity());
2.操作Vec
创建一个Vec
let mut vec: Vec<i32> = Vec::with_capacity(6);
let mut vec2 : Vec<u16> = Vec::new();
let mut vec3 = vec![2, 2, 3, 4, 5];
添加元素
vec.push(1);
批量添加
vec.append(vec![3,4,5,6,7].borrow_mut());
let mut vec4 : Vec<i32> = vec![8,9,10];
vec.append(&mut vec4);
在向量的位置索引处插入一个元素,将其后的所有元素向右移动,如果插入的位置大于长度则会恐慌
let mut vec = vec![1, 2, 3];
vec.insert(1, 4);//[1, 4, 2, 3]
移除最后一个值
vec.pop();
按索引删除,删除索引是1的的元素,如果该元素不存在,则引发恐慌
vec.remove(1);
保留指定元素,只保存能被2整除的数
let mut vec = vec![1, 2, 3, 4];
vec.retain(|&x| x % 2 == 0);
assert_eq!(vec, [2, 4]);
检查是否为空
vec.is_empty();
删除所有值
let mut v = vec![1, 2, 3];
v.clear();
assert!(v.is_empty());
验证向量中是否存在值:
let vector : Vec<i32> = vec![2,11,10];
vector.contains(&200); // false
vector.contains(&2); // true
3.遍历
遍历元素,这种是不能更改元素自身的值的
let vector = vec![1,2,3,4,5,6,7];
let vecter_iterator = vector.iter();
for elem in vecter_iterator
{
println!("{}", elem);
}
遍历元素并更改元素的值
let mut vector = vec![1,2,3,4,5,6,7];
let vecter_iterator = vector.iter_mut();
for elem in vecter_iterator
{
*elem = *elem *2;
}
4.排序并二分查找
let mut vector = vec![10,22,3,14,51,16,27];
vector.sort();
vector.binary_search(&22);