动态数组 Vector
就像它的名字一样:动态数组
以下是元组、数组、动态数组的对照表:
| 特性 | 元组 (Tuple) | 数组 (Array) | 动态数组 (Vector) |
|---|---|---|---|
| 长度 | 固定(编译时确定) | 固定(编译时确定) | 动态(运行时可变) |
| 内存分配 | 栈(可能包含堆数据) | 栈 | 堆 |
| 元素类型 | 异构(允许不同类型) | 同构(必须相同类型) | 同构(必须相同类型) |
| 访问方式 | .0 .1(直接索引) | [0] [1](索引访问) | [0] 或 get(0) |
| 越界检查 | 无(直接访问) | 运行时 panic(若越界) | 运行时 panic 或返回 None |
| 性能 | 最高(无额外开销) | 高(栈分配) | 较低(堆分配+动态管理) |
| 常用场景 | 临时组合少量异构数据 | 固定长度的简单数据集 | 需要动态增删的数据集合 |
panic:程序遇到错误后直接终止并提供反馈(俗称崩溃)
创建方式
Vec::new
rust
let v: Vec<i32> = Vec::new(); // 因为编译器没有得到任何关于类型的暗示信息,所以要显式地声明了类型 Vec<i32>,当你向里面增加一个元素后,一切又不同了:
rust
let mut v = Vec::new(); // mut 表示可变
v.push(1); //使用push向v中添加元素如果预先知道要存储的元素个数,可以使用 Vec::with_capacity(capacity) 创建动态数组,这样可以避免因为插入大量新数据导致频繁的内存分配和拷贝,提升性能
vec!宏
rust
let v = vec![1, 2, 3];vec!宏会自动推导出 Vec 的类型,因此不需要显式指定类型。 适合场景:初始化一个已经包含多个元素的动态数组。
后续
https://course.rs/basic/collections/vector.html#更新-vector
.iter 遍历器 .iter.next