rust Vec使用大全 Vec是 Rust 中最常用的动态数组类型它允许你在堆上存储可变长度的、相同类型的元素序列。下面是一份涵盖从创建、操作到进阶技巧的使用指南。 创建与初始化创建空 Vec使用Vec::new()需要显式指定类型或通过后续操作让编译器推断。rustlet mut v: Veci32 Vec::new(); // 类型标注是必要的使用宏初始化使用vec!宏可以快速创建并填充元素编译器能自动推断类型。rustlet v vec![1, 2, 3]; // v 的类型是 Veci32预分配容量使用Vec::with_capacity(capacity)可以创建一个具有指定容量的空 Vec。当你知道大概要存储的元素数量时这能有效减少内存重分配提升性能。rustlet mut v: Veci32 Vec::with_capacity(10); println!(容量: {}, v.capacity()); // 输出 10✍️ 增删改查添加元素末尾添加使用push方法将元素追加到 Vec 的末尾。rustlet mut v vec![1, 2]; v.push(3);批量添加使用extend方法可以将一个迭代器的所有元素添加到末尾。rustlet mut v vec![1, 2]; v.extend([3, 4, 5].iter());插入指定位置使用insert方法在指定索引处插入元素效率为 O(n)因为它会移动后续所有元素。rustlet mut v vec![1, 3]; v.insert(1, 2); // 在索引1处插入2访问元素索引语法可能引发 panic使用v[index]直接访问如果索引越界程序会直接崩溃 (panic)。适用于你确信索引一定有效的情况。rustlet v vec![1, 2, 3]; let second v[1];get方法安全访问使用v.get(index)会返回一个OptionT。索引有效时返回Some(T)无效时返回None不会引发 panic。它更安全适合索引可能无效的场景。rustlet v vec![1, 2, 3]; match v.get(5) { Some(value) println!(找到了: {}, value), None println!(索引超出范围!), }修改元素可以通过可变引用mut v[index]直接修改已存在的元素。rustlet mut v vec![1, 2, 3]; v[1] 4; // 将第二个元素修改为4删除元素末尾删除pop方法移除最后一个元素并返回OptionT如果 Vec 为空则返回None。rustlet mut v vec![1, 2, 3]; assert_eq!(v.pop(), Some(3));移除指定位置remove方法移除指定索引的元素并将其返回。它会将后面的所有元素左移因此效率为 O(n)。rustlet mut v vec![1, 2, 3]; let removed v.remove(1); // removed 为 2, v 变为 [1, 3]高效交换删除swap_remove方法移除指定索引的元素并用最后一个元素替换它然后弹出最后一个元素。它的效率是 O(1)但不保证元素的原有顺序。如果你不关心元素顺序这是更好的选择。rustlet mut v vec![a, b, c, d]; let removed v.swap_remove(1); // removed 为 b, v 变为 [a, d, c]按条件删除retain方法保留所有满足闭包条件的元素删除不满足的。rustlet mut v vec![1, 2, 3, 4, 5]; v.retain(|x| x % 2 0); // 保留偶数v 变为 [2, 4] 遍历与查询不可变遍历使用v的for循环可以借用并遍历每个元素。rustlet v vec![1, 2, 3]; for i in v { println!({}, i); }可变遍历使用mut v的for循环可以可变地借用并修改每个元素。rustlet mut v vec![1, 2, 3]; for i in mut v { *i 10; // 每个元素都加10 }获取长度和判断是否为空使用len()获取元素个数is_empty()检查是否为空。rustlet v vec![1, 2]; assert_eq!(v.len(), 2); assert_eq!(v.is_empty(), false);检查是否包含某元素使用contains方法检查 Vec 是否包含某个值。rustlet v vec![1, 2, 3]; assert_eq!(v.contains(2), true);⚙️ 进阶操作容量管理capacity()获取当前已分配的内存量能容纳的元素个数。reserve(additional)为至少additional个新元素预留空间避免频繁重分配。shrink_to_fit()将容量缩小到刚好等于长度释放多余内存。try_reserve(additional)尝试预留空间如果内存不足则返回错误而不是直接 panic。转为切片/数组into_boxed_slice()方法可以将VecT转换为Box[T]一个装箱的切片这会丢弃所有多余的容量。处理原始指针from_raw_parts(ptr, length, capacity)这是一个unsafe函数用于从原始指针、长度和容量重新构建一个Vec。调用者必须保证传入的参数有效且符合规范否则会导致未定义行为。这是高级操作用于与 C 代码交互等场景。into_raw_parts(self)这是一个实验性API (需要#![feature(vec_into_raw_parts)])用于将Vec分解为原始指针、长度和容量并将内存的所有权转移给调用者。 核心原则相同类型Vec只能存储相同类型的元素。所有权当Vec离开作用域时它及其所拥有的所有元素都会被自动释放。借用检查Rust 的所有权和借用规则保证了在使用Vec时不会发生内存不安全的行为。例如你不能在持有元素不可变引用的同时去修改Vec的结构如 push 新元素因为这可能导致引用失效。上面提到的这些方法基本覆盖了Vec的日常操作。如果对某个具体方法比如try_reserve的错误处理或是from_raw_parts的安全条件有疑问可以随时再问