当前位置:首页 > Rust > 正文

深入理解 Rust 向量(Vec)

Rust 编程 中,Vec(向量)是最常用、最重要的 Rust 数据结构 之一。它是一个可变长度的动态数组,能够高效地存储和操作一系列相同类型的元素。无论你是刚接触 Rust 向量 的新手,还是希望系统梳理 Rust Vec 用法的开发者,本教程都将为你提供清晰、详尽的讲解。

深入理解 Rust 向量(Vec) Rust向量 Vec Rust编程教程 Rust数据结构 第1张

什么是 Vec?

Vec<T> 是 Rust 标准库提供的一个泛型类型,用于表示一个可增长的、连续内存存储的动态数组。其中 T 表示元素的类型。与固定大小的数组不同,Vec 可以在运行时动态添加或删除元素。

如何创建 Vec?

有多种方式可以创建一个向量:

1. 使用 Vec::new()

let mut v: Vec<i32> = Vec::new();v.push(1);v.push(2);v.push(3);

2. 使用宏 vec!

// 创建并初始化let v = vec![1, 2, 3];// 创建包含5个0的向量let zeros = vec![0; 5]; // [0, 0, 0, 0, 0]

访问 Vec 中的元素

你可以通过索引或使用 get 方法安全地访问元素:

let v = vec![10, 20, 30];// 方式1:使用方括号(不安全,越界会 panic)println!("{}", v[0]); // 输出 10// 方式2:使用 get(安全,返回 Option)match v.get(1) {    Some(value) => println!("{}", value),    None => println!("索引越界!")}

修改 Vec

由于 Vec 是可变的,你可以在声明为 mut 后对其进行修改:

let mut v = vec![1, 2, 3];v.push(4);        // 添加元素到末尾v.pop();          // 移除最后一个元素(返回 Option)v.insert(1, 99);  // 在索引1处插入99v.remove(0);      // 移除索引0处的元素println!("{:?}", v); // [99, 2, 3]

遍历 Vec

Rust 提供了多种遍历方式:

let v = vec!["apple", "banana", "cherry"];// 不可变引用遍历for item in &v {    println!("{}", item);}// 可变引用遍历(用于修改)let mut numbers = vec![1, 2, 3];for num in &mut numbers {    *num += 10;}println!("{:?}", numbers); // [11, 12, 13]

性能与内存管理

Vec 在底层使用堆内存分配,具有以下特点:

  • 元素在内存中连续存储,缓存友好,访问速度快。
  • 当容量不足时,Vec 会自动重新分配更大的内存块(通常翻倍),并将旧元素复制过去。
  • 你可以使用 capacity() 查看当前容量,用 reserve() 预分配空间以避免频繁重分配。
let mut v = Vec::with_capacity(10); // 预分配10个元素的空间println!("容量: {}", v.capacity()); // 容量: 10for i in 0..10 {    v.push(i);}// 此时不会触发内存重分配

常见陷阱与最佳实践

  • 不要对空 Vec 使用 v[0],会导致 panic。
  • 优先使用 get 方法进行安全访问。
  • 如果知道元素数量,使用 Vec::with_capacity(n) 提高性能。
  • 避免在循环中频繁 push 而不预分配,可能导致多次内存拷贝。

总结

Vec 是 Rust 编程 中不可或缺的工具。掌握 Rust 向量 的创建、访问、修改和性能优化技巧,将极大提升你的开发效率和程序稳定性。无论你是在处理用户输入、解析文件,还是构建复杂的数据结构,Rust Vec 都是你最可靠的伙伴。

希望这篇关于 Rust 数据结构 的教程能帮助你轻松上手 Vec!动手写几个小例子,你会很快熟悉它的用法。