向量(
Vec<T>
)是 Rust 中最常用的集合类型之一,用于存储同一类型的值列表。它们在处理文件行、购物车商品价格或其他需要有序存储数据的场景中非常有用。
创建向量
您可以使用
Vec::new()
函数创建一个空向量,或者使用
vec!
宏创建一个包含初始值的向量:
fnmain() {
// 创建一个空向量,用于存储 i32 类型的值
let v: Vec<i32> = Vec::new();
// 创建一个包含初始值的向量
let v = vec![1, 2, 3];
}
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![1, 2, 3, 4, 5];
// 使用索引访问元素
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![1, 2, 3, 4, 5];
// 使用索引访问超出范围的元素会导致 panic
let does_not_exist = &v[100];
// 使用 get 方法访问超出范围的元素返回 None
let does_not_exist = v.get(100);
}
选择使用哪种方法取决于您的程序逻辑,如果出现超出范围的索引是不可接受的错误,则使用
[]
方法;如果超出范围的索引是可能发生的正常情况,则使用
get
方法。
借用规则和向量
在对向量进行操作时,需要遵守 Rust 的借用规则。例如,如果持有对向量元素的不可变引用,则无法修改向量本身。
fnmain() {
letmut v = vec![1, 2, 3, 4, 5];
// 持有对第一个元素的不可变引用
let first = &v[0];
// 尝试向向量添加元素会引起错误,因为 v 同时被借用了
v.push(6);
println!("第一个元素是:{}", first);
}
这是因为向量在内存中是连续存储的,添加新元素可能会导致内存重新分配,从而使指向旧元素的引用失效。借用规则确保了程序的安全性和正确性。
迭代向量元素
可以使用
for
循环迭代向量中的元素:
fnmain() {
let v = vec![100, 32, 57];
// 迭代不可变引用
for i in &v {
println!("{i}");
}
// 迭代可变引用
letmut v = vec![100, 32, 57];
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![1, 2, 3, 4];
// 使用 v
} // v 超出作用域,被销毁
}
总结
向量是 Rust 中非常强大的集合类型,它提供了多种方法来存储、访问和修改数据。通过理解向量的工作原理以及 Rust 的借用规则,您可以有效地使用向量来构建各种数据结构和算法。
扩展
除了本篇文章中介绍的内容之外,向量还提供了许多其他有用的方法,例如
pop
、
insert
、
remove
等。您可以在 Rust 官方文档中找到关于向量 API 的详细介绍。
此外,您还可以学习其他集合类型,例如
String
、
HashMap
等,它们在不同的场景下都有独特的优势。
学习 Rust 集合类型是掌握 Rust 编程的关键,希望本文能帮助您更好地理解和使用向量。
文章精选
点 击 关 注 并 扫 码 添 加 进 交 流 群
领
取
「Rust
语
言
」
学
习
资
料