首页 > 其他分享 >4. rust基础Vec-可变数组

4. rust基础Vec-可变数组

时间:2025-01-16 17:53:54浏览次数:1  
标签:mut 元素 let vec 可变 println rust Vec

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), // 输出 3
    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);  // 输出: [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 的内存安全和性能优势,同时享受灵活的动态集合操作。

标签:mut,元素,let,vec,可变,println,rust,Vec
From: https://www.cnblogs.com/learnForLife/p/18675499

相关文章

  • rust学习十七.1、async和await
    本文对应相关书籍17.1章节。先言:async和多线程没有什么密切关系,当然也不是毫无关系!一、async在rust到底是什么async中文的意思是异步,在编程中指的是:执行一段代码,主线程可以在等待完成之前,先做其它事情。如果有写过前端代码,就明白这个东西。例如经典的jquery的ajax默认就是异步......
  • 基于Vector工具进行CAN协议错误帧的分析实践
    引言  CAN(ControllerAreaNetwork)协议是当前使用最普遍的车载通信协议之一,其优点不只体现在多主并行、最高达1Mbit/sec的传输速率(针对标准CAN)、基于优先级的仲裁机制以及广播发送的短帧结构,还体现在其错误检测机制上。通过总线数据以及总线波形来分析总线故障时,CAN协议错误......
  • Rust程序Vec中存储的一般都是Box动态指针吗?
    Rust程序Vec中存储的一般都是Box动态指针吗?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU在Rust中,Vec<T>不是专门存储Box<T>或其他动态指针,而是存储类型T的值。具体来说,Vec<T>会按照值的类型T来管理数据,它通常使用堆分配内存来存储数据(对于较大的数据或当数据需要动态增长时......
  • Rust如何在代码中查看一个变量的数据类型?
    Rust如何在代码中查看一个变量的数据类型?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU在Rust中,你可以使用std::any::TypeId来查看一个变量的类型,但是这种方式通常用于调试或元编程,而不是日常开发的主要方法。Rust是强类型语言,通常在编译时就能检查类型,开发者无需显式查看类型。但......
  • 《鸿蒙开发-答案之书》RelativeContainer不好理解?
    《鸿蒙开发-答案之书》RelativeContainer不好理解?RelativeContainer关键是锚点,子组件要放那里?就比如我拿起这个子组件,它的右边要和父组件右边对齐。那我锚点就右边,然后去锚父组件的右。代码如下:RelativeContainer(){Text('123').width(30)......
  • cv::Vec3f什么意思
    cv::Vec3f是OpenCV中用于表示三维向量或三通道颜色的类。具体来说,cv::Vec3f是一个包含三个float类型元素的向量,通常用于以下几种情况:颜色表示:在图像处理中,Vec3f常用于表示颜色值,尤其是在浮点图像中。例如,一个RGB颜色可以用cv::Vec3f表示,其中每个分量(红色、绿色、蓝......
  • Autopy 是一款基于 Python 和 Rust 的强大 GUI 自动化库
    Autopy是一款基于Python和Rust的强大GUI自动化库,它为开发者提供了简便且高效的API来模拟鼠标和键盘的操作、在屏幕上查找颜色和位图以及显示警报。这些功能使得Autopy成为了一个跨平台的自动化工具,适用于MacOSX、Windows以及支持XTest扩展的X11系统。跨......
  • 手机端rustdesk如何进行配置
    安装rustdesk客户端以后,可以按照下图填写配置信息手机版也是可以快速导入导出,可以方便从其他设备或者客户端直接导入配置信息,然后在本软件进行导入或者导出......
  • rustdesk如何开启远程教程
    手机端在软件底部选择【共享屏幕】,在共享屏幕里面选择启动服务。主控和被控手机同时都配置好了ID服务器的信息以后,在软件底部选择【连接】然后输入远程ID,选择连接就行了。提示输入密码,可以查看一下被控客户端的密码,或者可以给被控客户端设置固定密码。......
  • C++标准库vector 的push_back和emplace_back有什么区别?
    以下是对vector的push_back和emplace_back方法的详细解释:一、push_back方法功能:push_back是std::vector类的成员函数,用于在向量的末尾添加元素。当使用push_back时,会将元素的副本添加到向量的末尾。使用示例:#include<iostream>#include<vector>cl......