Skip to content

Rust Vector 学习笔记

前言

Rust 中的动态数组类型是 Vec(Vector),也就是向量,中⽂翻译成动态数组。它⽤来存储同一个类型的多个值。并且可以在运行的时候扩容或者缩小。所以也叫动态数组。 在 Go 语言中叫 Slice。在 Python 语言中叫 List。

创建 Vector

不可变 Vector

rust
fn main() {
    let v1: Vec<u8> = Vec::new();
    let v2: Vec<u8> = [1, 2, 3].to_vec();
    let v3: Vec<u8> = !vec![1, 2, 3];
    let v4: Vec::<u8> = vec![1, 2, 3];
    let v5 = vec![1, 2, 3];
    let v6 = Vec::<u8>::new();
    let v7 = Vec::new();
}

可变 Vector

rust
fn main() {
    let mut v1: Vec<u8> = Vec::new();
    let mut v2: Vec<u8> = [1, 2, 3].to_vec();
    let mut v3: Vec<u8> = !vec![1, 2, 3];
    let mut v4: Vec::<u8> = vec![1, 2, 3];
    let mut v5 = vec![1, 2, 3];
    let mut v6 = Vec::<u8>::new();
    let mut v7 = Vec::new();
}

创建可变 Vector 并添加元素

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	println!("{:?}", v8);
}

清空 Vector 中的元素

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	// 清空元素
	v8.claer();
	println!("{:?}", v8);
}

添加多个元素到 Vector 中

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	// 添加多个元素
	v8.extend(&[4,5,6,7]);
	println!("{:?}", v8);
}

查询 Vector 的容量和长度

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	let capacity = v8.capacity();
	let len = v8.len();
	println!("capacity: {}", capacity);
	println!("len: {}", len;
}

查询 Vector 是否为空

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	// 查询 Vec 是否为空
	let is_empty = v8.is_empty();
	println!("is_empty: {}", is_empty);
	// 输出:
	// is_empty: false
}

通过索引访问 Vector 中的元素

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	// 通过索引访问 Vec 中的元素
	let first = v8[0];
	let second = v8[1];
	let third = v8[2];
	println!("first: {}", first);
	println!("second: {}", second);
	println!("third: {}", third)
	// 输出:
	// first: 0
	// second: 1
	// third: 2
	// 如果索引超出
}

如果索引超出 Vector 的长度,会发生什么?

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	let last = v8[10];
	// 如果索引超出当前 Vec 长度
	println!("last: {}", last);
	// 输出:
	// index out of bounds: the len is 4 but the index is 10
}

通过索引修改 Vector 中的元素

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	// 通过索引修改 Vec 中的元素
	v8[0] = 10;
	println!("v8: {:?}", v8);
	// 输出:
	// v8: [10, 1, 2, 3]
}

通过索引删除 Vector 中的元素

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	// 通过索引删除 Vec 中的元素
	v8.remove(0);
	println!("v8: {:?}", v8);
	// 输出:
	// v8: [1, 2, 3]
}

遍历 Vector 中的元素

rust
fn main(){
    let mut v8: Vec<u8> = Vec::new();
	v8.push(0);
	v8.push(1);
	v8.push(2);
	v8.push(3);
	// 使用循环和下标遍历 Vec 中的元素
	for i in 0..v8.len() {
	    println!("v8[{}]: {}", i, v8[i]);
	}
	// 使用循环和迭代器遍历 Vec 中的元素
	for entry in v8.iter() {
	    println!("entry: {}", entry);
	}
}

转换为 &[8] 或者 &[T]

要将 Vector 转换为 &[u8],您可以使用切片的引用符号 &,在 Vector 上使用 as_slice() 或 as_ref() 方法。下面是三种方法的示例:

rust
fn main() {
    let vec: Vec<u8> = vec![1, 2, 3, 4, 5];
	// 使用切片引用符号 &
    let slice: &[u8] = &vec;                   
	// 输出: Slice: [1, 2, 3, 4, 5]
    println!("Slice: {:?}", slice);            
	// 使用 as_slice() 方法
    let slice_ref: &[u8] = vec.as_slice();      
	// 输出: Slice Ref: [1, 2, 3, 4, 5]
    println!("Slice Ref: {:?}", slice_ref);    
	// 使用 as_ref() 方法
    let slice_ref2: &[u8] = vec.as_ref();       
	// 使用 as_ref() 方法
    println!("Slice Ref 2: {:?}", slice_ref2);  
	let slice_ref_3 = &vec[..];
	println!("Slice Ref 3: {:?}", slice_ref3);  
}

这样,您就可以将 Vector 转换为 &[u8] 切片来使用。&[u8]可以使用 Tokio Bytes 库来增加更多的功能。

Last Updated: