当前位置: 欣欣网 > 码农

Rust 中使用向量存储值列表

2024-07-29码农

向量( Vec<T> )是 Rust 中最常用的集合类型之一,用于存储同一类型的值列表。它们在处理文件行、购物车商品价格或其他需要有序存储数据的场景中非常有用。

创建向量

您可以使用 Vec::new() 函数创建一个空向量,或者使用 vec! 宏创建一个包含初始值的向量:

fnmain() {
// 创建一个空向量,用于存储 i32 类型的值
let v: Vec<i32> = Vec::new();
// 创建一个包含初始值的向量
let v = vec![123];
}

Rust 可以根据初始值推断出向量的类型,因此通常不需要显式类型注解。

更新向量

可以使用 push 方法将元素添加到向量末尾:

fnmain() {
letmut v = Vec::new();
v.push(5);
v.push(6);
v.push(7);
v.push(8);
}

请注意,为了修改向量,需要使用 mut 关键字将其声明为可变的。

读取向量元素

可以通过索引或 get 方法访问向量中的元素:

fnmain() {
let v = vec![12345];
// 使用索引访问元素
let third: &i32 = &v[2];
println!("第三个元素是:{}", third);
// 使用 get 方法访问元素
let third: Option<&i32> = v.get(2);
match third {
Some(third) => println!("第三个元素是:{}", third),
None => println!("没有第三个元素。"),
}
}

向量从 0 开始索引,因此索引 2 对应第三个元素。 get 方法返回一个 Option<&T> ,如果索引有效,则包含对元素的引用,否则为 None

处理无效索引

当使用索引访问向量元素时,如果索引超出范围,程序会 panic。使用 get 方法可以避免 panic,因为它会返回 None

fnmain() {
let v = vec![12345];
// 使用索引访问超出范围的元素会导致 panic
let does_not_exist = &v[100];
// 使用 get 方法访问超出范围的元素返回 None
let does_not_exist = v.get(100);
}

选择使用哪种方法取决于您的程序逻辑,如果出现超出范围的索引是不可接受的错误,则使用 [] 方法;如果超出范围的索引是可能发生的正常情况,则使用 get 方法。

借用规则和向量

在对向量进行操作时,需要遵守 Rust 的借用规则。例如,如果持有对向量元素的不可变引用,则无法修改向量本身。

fnmain() {
letmut v = vec![12345];
// 持有对第一个元素的不可变引用
let first = &v[0];
// 尝试向向量添加元素会引起错误,因为 v 同时被借用了
v.push(6);
println!("第一个元素是:{}", first);
}

这是因为向量在内存中是连续存储的,添加新元素可能会导致内存重新分配,从而使指向旧元素的引用失效。借用规则确保了程序的安全性和正确性。

迭代向量元素

可以使用 for 循环迭代向量中的元素:

fnmain() {
let v = vec![1003257];
// 迭代不可变引用
for i in &v {
println!("{i}");
}
// 迭代可变引用
letmut v = vec![1003257];
for i in &mut v {
*i += 50;
}
}

使用 &mut 可以获取对元素的可变引用,并对元素进行修改。

使用枚举存储不同类型

向量只能存储同一类型的元素,但可以使用枚举来存储不同类型的元素。

fnmain() {
enumSpreadsheetCell {
Int(i32),
Float(f64),
Text(String),
}
let row = vec![
SpreadsheetCell::Int(3),
SpreadsheetCell::Text(String::from("blue")),
SpreadsheetCell::Float(10.12),
];
}

枚举的每个变体都属于同一个类型,因此可以将枚举存储在向量中,从而间接存储不同类型的元素。

向量销毁

当向量超出作用域时,它会被销毁,其包含的元素也会被销毁。借用规则确保了在向量销毁之前,不会有任何引用指向其元素。

fnmain() {
{
let v = vec![1234];
// 使用 v
// v 超出作用域,被销毁
}

总结

向量是 Rust 中非常强大的集合类型,它提供了多种方法来存储、访问和修改数据。通过理解向量的工作原理以及 Rust 的借用规则,您可以有效地使用向量来构建各种数据结构和算法。

扩展

除了本篇文章中介绍的内容之外,向量还提供了许多其他有用的方法,例如 pop insert remove 等。您可以在 Rust 官方文档中找到关于向量 API 的详细介绍。

此外,您还可以学习其他集合类型,例如 String HashMap 等,它们在不同的场景下都有独特的优势。

学习 Rust 集合类型是掌握 Rust 编程的关键,希望本文能帮助您更好地理解和使用向量。

文章精选

「Rust