4. rust基础Vec-可变数组

news/2025/1/16 17:54:51/文章来源:https://www.cnblogs.com/learnForLife/p/18675499

Vec 基本知识

  1. 定义
    Vec 是一个存储堆分配的数据类型,可以动态改变大小。你可以将元素推送到 Vec 中,或者从其中删除元素。

  2. 动态大小
    不像数组([T; N])那样大小固定,Vec 的大小在运行时是可变的。你可以向 Vec 添加元素,也可以删除元素,甚至将它的容量增加或减少。

如何使用 Vec

1. 创建一个空的 Vec

let mut vec: Vec<i32> = Vec::new();  // 创建一个空的 Vec
vec.push(1);  // 向 Vec 中添加元素
vec.push(2);

2. 使用宏创建 Vec

let vec = vec![1, 2, 3];  // 创建并初始化一个 Vec

3. 访问 Vec 元素

let vec = vec![1, 2, 3];
println!("{}", vec[0]); // 访问第一个元素,输出 1

如果访问的索引超出范围,会导致 panic,因此如果不确定索引是否有效,建议使用 get 方法,它返回一个 Option 类型。

let vec = vec![1, 2, 3];
match vec.get(2) {Some(value) => println!("{}", value), // 输出 3None => 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);  // 输出: [10, 2, 3]

6. 移除元素

let mut vec = vec![1, 2, 3];
vec.pop();  // 删除最后一个元素
println!("{:?}", vec);  // 输出: [1, 2]

7. 清空 Vec

let mut vec = vec![1, 2, 3];
vec.clear();  // 清空 Vec
println!("{:?}", vec);  // 输出: []

8. 添加元素

let mut vec = vec![1, 2, 3];
vec.push(4);  // 在 Vec 末尾添加元素
println!("{:?}", vec);  // 输出: [1, 2, 3, 4]

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 中添加元素时,可能会发生重新分配。你可以使用 capacityreserve 方法优化性能,避免频繁分配内存。

let mut vec = Vec::with_capacity(10); // 创建一个具有 10 个元素容量的 Vec
vec.reserve(20); // 增加更多容量,避免在 20 个元素时重新分配

3. 弹出元素并返回

Vec 提供了 pop 方法来移除并返回最后一个元素:

let mut vec = vec![1, 2, 3];
let last_element = vec.pop();  // 返回 Some(3)

4. 使用 Vec 的切片

通过切片,可以访问 Vec 的一部分而不进行复制:

let vec = vec![1, 2, 3, 4, 5];
let slice = &vec[1..4];  // 获取切片 [2, 3, 4]
println!("{:?}", slice);  // 输出: [2, 3, 4]

与数组的区别

  • 大小Vec 的大小是可变的,而数组的大小是固定的。
  • 内存分配Vec 是在堆上分配内存的,因此可以动态增长;而数组的内存是在栈上分配的,大小在编译时必须已知。
  • 性能:由于 Vec 是动态增长的,它比数组具有更灵活的内存管理,但相应的开销也更大。

总结

  • Vec 是 Rust 中的动态数组,可以动态添加和删除元素。
  • 它提供了与数组类似的操作,但允许你在运行时调整大小。
  • Vec 用于需要存储可变数量元素的情况,广泛应用于实际项目中。

通过使用 Vec,你可以充分利用 Rust 的内存安全和性能优势,同时享受灵活的动态集合操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870227.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker containner挂掉,无法exec进入bash,如何修改文件的终极解决方法.210730

场景: Nginx在bash里面配置的时候挂掉了,然后docker start不起来,exec bash进不去,造成无法再改里面的文件了 解决方法: 1,docker ps –a 可以查到所有docker,包括没有运行的,找到containner ID [root@hecs-29489 ~]# docker ps -a CONTAINER ID IMAGE COMMAND…

HP惠普笔记本重装系统无法引导无法进操作系统的终极解决方法.210804

F9进入BIOS-先进(Advanced)-安全引导配置- 启用传统支持和禁用安全引导.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; padding: 0px 0px 50px 0px } .zsleft { float: left } .zsdiv { display:…

Feign与SpringCloud LoadBalancer实现负载均衡源码分析

SpringCloud LoadBalancer 众所周知,SpringCloud体系中负载均衡的组件有SpringCloud LoadBalancer和Ribbon,Ribbon也在逐渐的被替代掉,因为SpringCloud LoadBalancer性能更高,支持响应式 下面通过hard-coded体现一下SpringCloud的负载均衡 首先有一个【say-hello】服务,提…

JS — 判断语句与循环语句

js的判断语句与循环语句...(* ̄0 ̄)ノ判断语句JavaScript中的if-else语句与C++、Python、Java中类似。直接输出到控制台:test.html中的内容为: <script type="module">let score = 90;if (score >= 85) {console.log("A");} else if (score &g…

Living-Dream 系列笔记 第92期

最小路径点覆盖 在一张 DAG 上,求一个路径的集合,使得它们两两不相交,且覆盖所有的点。 结论:答案即为 \(总点数-最大匹配\)(于是 \(总点数-最大匹配=总点数-最小点覆盖=最大独立集=最大团=最小路径点覆盖\))。 证明: 不妨转换角度,从研究路径转为研究点。 因为路径两两…

毕设学习第四天之Java的注解和反射

注解(Annotation) Java 注解(Annotation)是一种特殊的语言构造,用于为代码元素(如类、方法、字段等)提供元数据,通常不直接影响程序的逻辑执行。它们可以被编译器、框架或工具解析,用于执行特定操作,如自动化配置、代码生成、验证等。Java 提供了内置的注解(如 @Overr…

Docker安装wikijs wiki系统.210818

1. 拉取mysql8的镜像并运行 docker pull mysqldocker run -d -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d --name mysql -e TZ=Asia/Shanghai -e MYSQL\_ROOT\_PASSWORD=1234 -p 3306:3306 mysql:latest2. 进入mysql,创建并修改权限 docker…

重载自动驾驶平板车HAV

随着无人驾驶在封闭场地和干线道路场景的加速落地,港口作为无人化运营的先行者,其场景的复杂度、特殊性对无人化运营的技术提出了各种挑战。为了应对港口无人化运营在实质化落地过程的挑战,经纬恒润借助自身在无人驾驶领域的深厚积累与实践,研发了全新的第三代重载自动驾驶…

【深度学习教程】Python 如何用 LSTM 做情感分析?小白也能上手!

Hello 大家好,今天我们来聊一个超热门的话题——**LSTM 网络在情感分析中的应用**!想象一下,通过深度学习,你的代码可以读懂人类情绪,知道“我爱你”和“我讨厌你”的区别,是不是很酷?今天这篇文章,我会手把手教你从零开始,用 Python 和 Keras 实现一个**基于 LSTM 的…

安川YASKAWA机器人主板维修方法合集

安川机械手板卡故障分析与YASKAWA机械臂主板维修步骤 1. 确认故障现象:首先,我们需要详细了解安川机器人主板故障现象,包括但不限于工作异常、运行错误、速度变慢等。 2. 拆卸主板:根据故障现象,找到相应的机械手电路板故障部位,并小心地将主板拆卸下来,确保不损坏其他部…

lstm理解

batch_size:表示再这样的数据集中有多少数据表单,本列中为3张表单,构成3维数据。若是10张表单,则10张表单堆叠在一起,构成3维数据。time_step:表示在3维时间序列中,每张表有多少行,每个时间序列有多少点,时间点实际就是时序序列的序列长度,成为时间步。input_diensio…

虚拟机Centos7.6安装Mysql8

由于本人贫穷, 没钱搞服务器, 就在虚拟机上安装了一个centos7.6服务器,然后今天给大家带来的是在centos7.6安装mysql8的教程。如果你也跟我一样贫穷,可以根据下面这篇教程来在虚拟机上安装centos7.6系统: https://zhuanlan.zhihu.com/p/698840895安装完成后,用xshell等工…