当前位置: 首页 > ds >正文

Rust 数据结构:Vector

Rust 数据结构:Vector

  • Rust 数据结构:Vector
    • 创建数组
    • 更新数组
      • 插入元素
      • 删除元素
    • 获取数组中的元素
    • 迭代数组中的值
    • 使用枚举存储多个类型
    • 删除一个数组会删除它的元素

Rust 数据结构:Vector

vector 来自标准库,在内存中连续存储相同类型的多个值。

创建数组

要创建一个新的空 vector,调用 Vec::new 函数,并指名类型。

let v: Vec<i32> = Vec::new();

Rust 方便地提供了 vec! 宏,它创建具有初始值的Vec<T>,无需类型注释。

let v = vec![1, 2, 3];

整数类型是 i32,因为这是默认的整数类型,Rust可以推断出 v 的类型是 Vec<i32>。

更新数组

插入元素

要创建一个 vector 并向其中添加元素,可以使用 push 方法。

    let mut v = Vec::new();v.push(5);v.push(6);v.push(7);v.push(8);

与任何变量一样,如果我们希望能够改变它的值,我们需要使用 mut 关键字使其可变。

我们放在里面的数字都是 i32 类型的,Rust 从数据中推断出这一点,所以我们不需要 Vec<i32> 注释。

删除元素

pop 方法删除并返回最后一个元素。

获取数组中的元素

有两种方法可以引用存储在 vector 中的值:通过索引或使用 get 方法。

    let v = vec![1, 2, 3, 4, 5];let third: &i32 = &v[2];println!("The third element is {third}");let third: Option<&i32> = v.get(2);match third {Some(third) => println!("The third element is {third}"),None => println!("There is no third element."),}

使用 & 和 [] 为我们提供了对索引值处元素的引用。当使用 get 方法将索引作为参数传递时,会得到一个 Option<&T>,可以与 match 一起使用。

注意,索引值不能超出现有元素范围。如果直接访问超出范围的元素,程序会报错。当 get 方法被传递给向量之外的索引时,它会返回 None 而不会报错。

当程序有一个有效的引用时,借阅检查器执行所有权和借阅规则,以确保这个引用和对vector内容的任何其他引用保持有效。回想一下在同一作用域中不能有可变引用和不可变引用的规则。该规则适用于下面的示例:

    let mut v = vec![1, 2, 3, 4, 5];let first = &v[0];v.push(6);println!("The first element is: {first}");

我们保存了一个指向 vector 中第一个元素的不可变引用,并尝试在末尾添加一个元素。如果我们稍后还试图在函数中引用该元素,则该程序将无法工作。

为什么对第一个元素的引用要关心 vector 末尾的变化?这个错误是由于 vector 的工作方式造成的:因为 vector 将值放在内存中相邻的位置,如果没有足够的空间将 vector 当前存储的所有元素放在相邻的位置,则在 vector 的末尾添加新元素可能需要分配新的内存并将旧元素复制到新的空间中。在这种情况下,对第一个元素的引用将指向已释放的内存。同一作用域中不能有可变引用和不可变引用的规则防止了这种情况。

迭代数组中的值

使用 for 循环可以遍历所有元素,而不是一次使用索引访问一个元素。

    let v = vec![100, 32, 57];for i in &v {println!("{i}");}

还可以遍历对可变向量中每个元素的可变引用,以便对所有元素进行修改。

    let mut v = vec![100, 32, 57];for i in &mut v {*i += 50;}

要更改可变引用所引用的值,必须先使用 * 解引用操作符获 取i 中的值,然后才能使用 += 操作符。

由于借用检查器的规则,对 vector 进行迭代(无论是不可变还是可变)都是安全的。如果试图在 for 循环体中插入或删除项,就会报错。

使用枚举存储多个类型

vector 只能存储相同类型的值。这可能很不方便。我们可以定义一个枚举,它的变体将保存不同的值类型,所有的枚举变体将被认为是相同的类型:枚举的类型。然后,可以创建一个 vector 容器来保存枚举,从而最终保存不同的类型。

    enum SpreadsheetCell {Int(i32),Float(f64),Text(String),}let row = vec![SpreadsheetCell::Int(3),SpreadsheetCell::Text(String::from("blue")),SpreadsheetCell::Float(10.12),];

删除一个数组会删除它的元素

当 vector 超出作用域时,它将被释放。

当 vector 被删除时,它的所有内容也被删除,这意味着它保存的整数将被清理。借用检查器确保仅在 vector 本身有效时才使用对 vector 内容的任何引用。

http://www.xdnf.cn/news/6589.html

相关文章:

  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.5)
  • FEKO许可证激活错误解决方法
  • 【Ansible基础】Ansible 核心组件深度解析:控制节点、受管节点、Inventory与Playbook
  • 建筑迈向绿色发展之路,楼宇自控成建筑可持续发展关键技术
  • 考研408《计算机组成原理》复习笔记,第二章(2)数值数据的表示和运算(浮点数篇)
  • 2025年大厂C++面试题总结与解析
  • 如何在Windows右键新建菜单中添加自定义项,将notepad添加到新建菜单
  • 黑马程序员C++2024版笔记 第0章 C++入门
  • Web安全科普:构建数字世界的“防盗门”
  • 贪吃蛇游戏消息通知功能开发全解析
  • 变分自编码器(Variational Autoencoder, VAE)
  • GDB的使用
  • TCSVT投稿记录
  • JAVA学习-练习试用Java实现“语音识别的基础 :如使用MFCC特征提取和简单的分类器”
  • Python 类变量与实例变量完全指南:区别、使用场景及常见陷阱
  • Vue 3中ref
  • 实验6 电子邮件
  • 【Java学习笔记】【第一阶段项目实践】零钱通(面向过程版本)
  • Vue3学习(组合式API——生命周期函数基础)
  • 分类预测 | Matlab实现ABC-Transformer人工蜂群算法优化编码器多特征分类预测/故障诊断Matlab实现
  • 抢购Python代码示例与技术解析
  • 1C:ENTERPRISE 8.3 实用开发者指南-示例和标准技术(Session1-Session3)
  • 《模版初阶》
  • matlab多项式
  • 【unity游戏开发——编辑器扩展】EditorGUIUtility提供一些 EditorGUI 相关的其他辅助API
  • 车载诊断架构 ---车载总线对于功能寻址的处理策略
  • 北京孙河傲云源墅:限量典藏的主城墅居臻品
  • 3.3 掌握RDD分区
  • 密码学刷题小记录
  • 一物一码赋能智能制造:MES如何实现生产全流程数字化追溯