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.mzph.cn/news/905677.shtml

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

相关文章

深度学习入门:深度学习(完结)

目录 1、加深网络1.1 向更深的网络出发1.2 进一步提高识别精度1.3 加深层的动机 2、深度学习的小历史2.1 ImageNet2.2 VGG2.3 GoogleNet2.4 ResNet 3、深度学习的高速化3.1 需要努力解决的问题3.2 基于GPU的高速化3.3 分布式学习3.4 运算精度的位数缩减 4、深度学习的应用案例4…

如何利用 Python 爬虫按关键字搜索京东商品:实战指南

在电商领域&#xff0c;京东作为国内知名的电商平台&#xff0c;拥有海量的商品数据。通过 Python 爬虫技术&#xff0c;我们可以高效地按关键字搜索京东商品&#xff0c;并获取其详细信息。这些信息对于市场分析、选品上架、库存管理和价格策略制定等方面具有重要价值。本文将…

‌JMeter聚合报告中的任务数和并发数区别

‌JMeter聚合报告中的任务数和并发数有本质的区别。‌ 任务数&#xff08;样本数&#xff09; 任务数或样本数是指在性能测试中发出的请求数量。例如&#xff0c;如果模拟20个用户&#xff0c;每个用户发送100次请求&#xff0c;那么总的任务数或样本数就是2000次请求‌ 并发…

Java 框架配置自动化:告别冗长的 XML 与 YAML 文件

在 Java 开发领域&#xff0c;框架的使用极大地提升了开发效率和系统的稳定性。然而&#xff0c;传统框架配置中冗长的 XML 与 YAML 文件&#xff0c;却成为开发者的一大困扰。这些配置文件不仅书写繁琐&#xff0c;容易出现语法错误&#xff0c;而且在项目规模扩大时&#xff…

OpenShift AI - 用 ModelCar 构建容器化模型,提升模型弹性扩展速度

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.18 OpenShift AI 2.19 的环境中验证 文章目录 什么是 ModelCar构建模型镜像在 OpenShift AI 使用模型镜像部署模型扩展速度对比 参考 什么是 ModelCar KServe 典型的模型初始化方法是从 S…

C#+WPF+prism+materialdesign创建工具主界面框架

代码使用C#WPFprismmaterialdesign创建工具主界面框架 主界面截图&#xff1a;

在选择合适的实验室铁地板和铸铁试验平板,帮分析​

铸铁测试底板是一种采用铸铁材料经过加工制成的基准测量工具&#xff0c;主要用于工业检测、机械加工和实验室等高精度要求的场合。其核心功能是为各类测量、检验、装配工作提供稳定的水平基准面&#xff0c;确保测量数据的准确性和一致性。 一、铸铁测试底板的基本特性 1.材质…

C++匿名函数

C 中的匿名函数&#xff08;Lambda 表达式&#xff09;是 C11 引入的一项重要特性&#xff0c;它允许你在需要的地方定义一个临时的、无名的函数对象&#xff0c;使代码更加简洁和灵活。 1. 基本语法 Lambda 表达式的基本结构&#xff1a; [capture list](parameter list) -…

LabVIEW机械振动信号分析与故障诊断

利用 LabVIEW 开发机械振动信号分析与故障诊断系统&#xff0c;融合小波变换、时频分布、高阶统计量&#xff08;双谱&#xff09;等先进信号处理技术&#xff0c;实现对齿轮、发动机等机械部件的非平稳非高斯振动信号的特征提取与故障诊断。系统通过虚拟仪器技术将理论算法转化…

湖北理元理律师事务所:债务优化如何实现“减负不降质”?

在债务压力普遍加剧的背景下&#xff0c;如何平衡债务清偿与生活质量&#xff0c;成为个人及企业关注的焦点。湖北理元理律师事务所基于多年实务经验&#xff0c;总结出一套“法律财务”双轨制债务优化模型&#xff0c;其核心在于通过科学规划&#xff0c;帮助债务人在法律框架…

多链互操作性标准解析:构建下一代区块链互联生态

引言 在区块链技术快速演进的今天&#xff0c;“多链宇宙”已成为不可逆的趋势。然而&#xff0c;链与链之间的孤立性导致流动性割裂、开发成本高昂和用户体验碎片化。互操作性标准的制定&#xff0c;正是打破这一僵局的核心钥匙。本文将深入探讨主流互操作性协议的技术架构、…

电脑开机提示按f1原因分析及解决方法(6种解决方法)

经常有网友问到一个问题,我电脑开机后提示按f1怎么解决?不管理是台式电脑,还是笔记本,都有可能会遇到开机需要按F1,才能进入系统的问题,引起这个问题的原因比较多,今天小编在这里给大家列举了比较常见的几种电脑开机提示按f1的解决方法。 电脑开机提示按f1原因分析及解决…

讲讲git 和svn

讲讲git 和svn 目录Git到底是什么&#xff1f;它该怎末用&#xff1f;核心概念基础操作1. 仓库的创建2. 文件的提交工作流程3. 分支管理4. 远程仓库操作 进阶操作实际应用建议**基本用法****常用命令的帮助示例****帮助文档的结构****替代方法****练习建议****核心概念****与Gi…

【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀

文章目录 &#x1f54a;️ 中介者模式&#xff08;Mediator Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;成就系统协调&#xff09;1. 定义中介者接口与同事基类2. 实现具体同事类3. 实现具体中介者4. 客户端使用 四、模式…

【网工第6版】第10章 网络规划和设计②

目录 ■ 网络分析与设计 ◆ 网络规划设计模型 ◆ 网络设计的约束因素 ◆ 技术评价 ■ 网络结构与功能 ◆ 局域网结构类型 ■ 网络冗余设计 ◆ 网络冗余设计-备用路径 ◆ 网络冗余设计-负载分担 ■ 广域网接入技术 ◆ 广域网接入技术 ◆ 接入和终结设备 ■ 网络分析…

PowerBI链接EXCEL实现自动化报表

PowerBI链接EXCEL实现自动化报表 曾经我将工作中一天的工作缩短至2个小时&#xff0c;其中最关键的一步就是使用PowerBI链接Excel做成一个自动化报表&#xff0c;PowerBI更新源数据&#xff0c;Excel更新报表并且保留报表格式。 以制作一个超市销售报表为例&#xff0c;简单叙…

C#.NET 或 VB.NET Windows 窗体中的 DataGridView – 技巧、窍门和常见问题

DataGridView 控件是一个 Windows 窗体控件&#xff0c;它允许您自定义和编辑表格数据。它提供了许多属性、方法和事件来自定义其外观和行为。在本文中&#xff0c;我们将讨论一些常见问题及其解决方案。这些问题来自各种来源&#xff0c;包括一些新闻组、MSDN 网站以及一些由我…

表记录的检索

1.select语句的语法格式 select 字段列表 from 表名 where 条件表达式 group by 分组字段 [having 条件表达式] order by 排序字段 [asc|desc];说明&#xff1a; from 子句用于指定检索的数据源 where子句用于指定记录的过滤条件 group by 子句用于对检索的数据进行分组 ha…

能源设备数据采集

在全球可持续发展目标与环境保护理念日益深入人心的时代背景下&#xff0c;有效管理和优化能源使用已成为企业实现绿色转型、提升竞争力的关键路径。能源设备数据采集系统&#xff0c;作为能源管理的核心技术支撑&#xff0c;通过对各类能源生产设备运行数据的全面收集、深度分…

【鸿蒙开发】性能优化

语言层面的优化 使用明确的数据类型&#xff0c;避免使用模糊的数据类型&#xff0c;例如ESObject。 使用AOT模式 AOT就是提前编译&#xff0c;将字节码提前编译成机器码&#xff0c;这样可以充分优化&#xff0c;从而加快执行速度。 未启用AOT时&#xff0c;一边运行一边进…