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

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 内容的任何引用。

相关文章:

  • Java并发编程:锁机制
  • VBA_NZ系列工具NZ10:VBA压缩与解压工具
  • 2025长三角杯数学建模B题思路模型代码:空气源热泵供暖的温度预测,赛题分析与思路
  • gitlab+portainer 实现Ruoyi Vue前端CI/CD
  • Memo of Omnipeek for 802.11 (Updating)
  • 产品更新丨谷云科技 iPaaS 集成平台 V7.5 版本发布
  • Secs/Gem第六讲(基于secs4net项目的ChatGpt介绍)
  • 【ROS2】编译Qt实现的库,然后链接该库时,报错:/usr/bin/ld: XXX undefined reference to `vtable for
  • 密码学实验:凯撒密码
  • mysql 字段类型解释
  • Linux基础 -- 在内存中使用chroot修复eMMC
  • Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)
  • OpenCV CUDA模块中矩阵操作------矩阵元素求和
  • 每日算法刷题计划Day7 5.15:leetcode滑动窗口4道题,用时1h
  • STM32单片机内存分配详细讲解
  • 使用gitbook 工具编写接口文档或博客
  • 【C++】汇编角度分析栈攻击
  • 一文读懂--程序的编译汇编和链接
  • Datawhale 5月llm-universe 第2次笔记
  • Vue 3中ref
  • 圆桌丨新能源车超充技术元年,专家呼吁重视电网承载能力可能面临的结构性挑战
  • 特朗普中东行:“能源换科技”背后的权力博弈|907编辑部
  • 不是10点!乌克兰官员称尚未就俄乌谈判开始时间达成一致
  • 李公明︱一周书记:当前科学观中的盲点、危机与……人类命运
  • 宜昌谱写新叙事:长江大保护与高质量发展如何相互成就
  • 端午假期购票日历发布,今日可购买5月29日火车票