Vec 基本知识
-
定义
Vec
是一个存储堆分配的数据类型,可以动态改变大小。你可以将元素推送到 Vec
中,或者从其中删除元素。
-
动态大小
不像数组([T; N]
)那样大小固定,Vec
的大小在运行时是可变的。你可以向 Vec
添加元素,也可以删除元素,甚至将它的容量增加或减少。
如何使用 Vec
1. 创建一个空的 Vec
| let mut vec: Vec<i32> = Vec::new(); |
| vec.push(1); |
| vec.push(2); |
2. 使用宏创建 Vec
3. 访问 Vec 元素
| let vec = vec![1, 2, 3]; |
| println!("{}", vec[0]); |
如果访问的索引超出范围,会导致 panic,因此如果不确定索引是否有效,建议使用 get
方法,它返回一个 Option
类型。
| let vec = vec![1, 2, 3]; |
| match vec.get(2) { |
| Some(value) => println!("{}", value), |
| None => println!("Index out of bounds"), |
| } |
4. 遍历 Vec
| let vec = vec![1, 2, 3]; |
| for val in &vec { |
| println!("{}", val); |
| } |
5. 修改 Vec 元素
| let mut vec = vec![1, 2, 3]; |
| vec[0] = 10; |
| println!("{:?}", vec); |
6. 移除元素
| let mut vec = vec![1, 2, 3]; |
| vec.pop(); |
| println!("{:?}", vec); |
7. 清空 Vec
| let mut vec = vec![1, 2, 3]; |
| vec.clear(); |
| println!("{:?}", vec); |
8. 添加元素
| let mut vec = vec![1, 2, 3]; |
| vec.push(4); |
| println!("{:?}", vec); |
Vec 的高级用法
1. 使用 Vec
存储不同类型的元素
如果想要在 Vec
中存储不同类型的数据,可以使用 Box<dyn Any>
或者 enum
来实现类型封装。
| enum MyEnum { |
| Integer(i32), |
| Float(f64), |
| } |
| |
| let mut vec: Vec<MyEnum> = Vec::new(); |
| vec.push(MyEnum::Integer(1)); |
| vec.push(MyEnum::Float(3.14)); |
2. Vec
的内存优化与容量管理
Rust 中的 Vec
会动态增长,当你向 Vec
中添加元素时,可能会发生重新分配。你可以使用 capacity
和 reserve
方法优化性能,避免频繁分配内存。
| let mut vec = Vec::with_capacity(10); |
| vec.reserve(20); |
3. 弹出元素并返回
Vec
提供了 pop
方法来移除并返回最后一个元素:
| let mut vec = vec![1, 2, 3]; |
| let last_element = vec.pop(); |
4. 使用 Vec
的切片
通过切片,可以访问 Vec
的一部分而不进行复制:
| let vec = vec![1, 2, 3, 4, 5]; |
| let slice = &vec[1..4]; |
| println!("{:?}", slice); |
与数组的区别
- 大小:
Vec
的大小是可变的,而数组的大小是固定的。
- 内存分配:
Vec
是在堆上分配内存的,因此可以动态增长;而数组的内存是在栈上分配的,大小在编译时必须已知。
- 性能:由于
Vec
是动态增长的,它比数组具有更灵活的内存管理,但相应的开销也更大。
总结
Vec
是 Rust 中的动态数组,可以动态添加和删除元素。
- 它提供了与数组类似的操作,但允许你在运行时调整大小。
Vec
用于需要存储可变数量元素的情况,广泛应用于实际项目中。
通过使用 Vec
,你可以充分利用 Rust 的内存安全和性能优势,同时享受灵活的动态集合操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】