【零基础学Rust | 基础系列 | 数据结构】元组,数组,向量,字符串,结构体

在这里插入图片描述


文章标题

  • 简介:
  • 一,元组:
    • 1,定义元组:
    • 2,访问元组元素:
    • 3,元组解构:
    • 4,元组在函数中的应用:
  • 二,数组:
    • 1,数组的声明和初始化
    • 2,访问数组元素
    • 3,数组的遍历
    • 4,数组的长度
    • 5,数组和函数
  • 三,向量:
    • 1,创建向量:
    • 2,访问向量:
    • 3,修改向量:
    • 4,遍历向量:
    • 5,常用方法:
  • 四,字符串:
    • 1,创建字符串:
    • 2,更新字符串:
    • 3,字符串连接:
    • 4,访问字符串内容:
    • 5,字符串切片:
    • 6,字符串和其他类型的转换:
  • 五,结构体:
    • 1,定义结构体
    • 2,创建结构体实例
    • 3,访问结构体字段
    • 4,修改结构体字段
    • 5,结构体更新语法
    • 6,元组结构体
    • 7,单元结构体
    • 8,结构体所有权
  • 总结:


简介:

在Rust编程语言中,数据结构是组织和存储数据的一种方式,它们使得数据可以高效地被访问和操作。本章将详细介绍元组,数组,向量,字符串,和结构体这几种基本的数据结构。

一,元组:

元组是Rust编程语言中的一种复合数据类型,它可以包含多个值,这些值可以是不同类型。元组的大小是固定的,一旦定义,其长度和元素的类型就不能改变。

1,定义元组:

在Rust中,元组是通过圆括号(())来定义的,元素之间用逗号(,)分隔。每个元素可以是不同类型,元组的类型是由所有元素的类型共同决定的。例如,下面的代码定义了一个包含三个元素的元组,第一个元素是整数,第二个元素是浮点数,第三个元素是字符串。

let tup: (i32, f64, &str) = (500, 6.4, "hello");

2,访问元组元素:

在元组中,可以使用点号(.)后跟索引来访问元素。索引是从0开始的,所以第一个元素的索引是0,第二个元素的索引是1,以此类推。例如,下面的代码分别获取了元组tup的第一个,第二个,和第三个元素。

let five_hundred = tup.0;
let six_point_four = tup.1;
let hello = tup.2;

3,元组解构:

除了使用索引访问元组元素外,Rust还提供了一种称为“解构”的方式来访问元组元素。解构是一种将元组的元素分解到不同的变量中的操作。例如,下面的代码将元组tup的元素解构到了三个变量x,y,和z中。

let (x, y, z) = tup;

在这段代码执行后,变量x的值是500,变量y的值是6.4,变量z的值是"hello"。

4,元组在函数中的应用:

在Rust中,函数可以返回元组,这使得函数可以返回多个值。例如,下面的函数返回一个包含两个元素的元组,第一个元素是输入的两个数的和,第二个元素是输入的两个数的差。

fn add_and_sub(a: i32, b: i32) -> (i32, i32) {(a + b, a - b)
}

调用这个函数时,可以使用解构来获取返回的元组的元素。

let (sum, diff) = add_and_sub(5, 3);

在这段代码执行后,变量sum的值是8,变量diff的值是2。


二,数组:

在Rust编程语言中,数组是一种基本的数据结构,用于存储多个相同类型的元素。数组的长度在声明时就已经确定,且在后续的使用中不能更改。这种固定长度的特性使得数组在某些场景下非常有用,例如,当你需要在栈上而不是在堆上存储数据时,或者当你需要确保总是有固定数量的元素时。

1,数组的声明和初始化

在Rust中,数组的声明和初始化可以通过多种方式完成。最基本的方式是使用方括号,其中包含了每个元素的类型和数组的长度,然后是等号,后面跟着用逗号分隔的元素列表。例如,以下代码声明并初始化了一个包含五个整数的数组:

let a: [i32; 5] = [1, 2, 3, 4, 5];

如果你想要创建一个每个元素都是相同值的数组,Rust提供了一个简洁的语法:首先是元素类型,然后是分号,然后是数组的长度,然后是等号,最后是元素的值。例如,以下代码创建了一个包含五个零的数组:

let a = [0; 5];

2,访问数组元素

在Rust中,可以使用索引来访问数组的元素。索引是在方括号中指定的数字,表示要访问的元素的位置。注意,数组的索引从0开始,所以第一个元素的索引是0,第二个元素的索引是1,以此类推。例如,以下代码创建了一个数组,并访问了其第一个和第二个元素:

let a = [1, 2, 3, 4, 5];
let first = a[0];
let second = a[1];

如果你尝试访问超出数组长度的索引,Rust会在编译时报错。这是Rust的一种安全性保护机制,可以防止访问无效的内存。

3,数组的遍历

遍历数组是一种常见的操作,可以用于访问和操作数组中的每个元素。在Rust中,可以使用for循环来遍历数组。例如,以下代码创建了一个数组,并打印了每个元素:

let a = [1, 2, 3, 4, 5];
for element in &a {println!("{}", element);
}

注意,这里使用了&a而不是a来获取数组的引用。这是因为在for循环中,Rust默认会获取元素的所有权,如果你不想改变数组的所有权,就需要使用引用。

4,数组的长度

可以使用.len()方法来获取数组的长度。例如,以下代码创建了一个数组,并打印了其长度:

let a = [1, 2, 3, 4, 5];
println!("{}", a.len());

5,数组和函数

在Rust中,可以将数组作为函数的参数,或者将数组作为函数的返回值。当将数组作为函数的参数时,需要指定数组的长度。例如,以下代码定义了一个函数,该函数接受一个包含五个整数的数组,并返回数组中的第一个元素:

fn first_element(a: [i32; 5]) -> i32 {a[0]
}
let a = [1, 2, 3, 4, 5];
println!("{}", first_element(a));

三,向量:

向量(Vector)是Rust的一种基本数据类型,它是一种可增长和缩小的数组。向量在内存中是连续的,可以高效地访问和修改。

1,创建向量:

创建向量的最常见方式是使用Vec::new函数,这将创建一个新的,空的向量。

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

也可以使用vec!宏来创建一个包含初始值的向量。

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

2,访问向量:

可以使用索引来访问向量中的值。注意,索引从0开始。

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

也可以使用get方法来访问向量中的值,这将返回一个Option。如果索引在向量的范围内,get方法将返回Some,否则返回None

let v = vec![1, 2, 3];
let second = v.get(1);

3,修改向量:

可以使用push方法向向量的末尾添加元素。

let mut v = vec![1, 2, 3];
v.push(4);

也可以使用pop方法移除并返回向量的最后一个元素。

let mut v = vec![1, 2, 3];
let last = v.pop();

4,遍历向量:

可以使用for循环来遍历向量中的所有元素。

let v = vec![1, 2, 3];
for i in &v {println!("{}", i);
}

如果需要在遍历向量的同时修改元素,可以使用iter_mut方法。

let mut v = vec![1, 2, 3];
for i in v.iter_mut() {*i += 1;
}

5,常用方法:

向量有许多其他的方法,例如len方法可以返回向量的长度,is_empty方法可以检查向量是否为空,clear方法可以清空向量,insert方法可以在指定位置插入元素,remove方法可以移除指定位置的元素,等等。

let mut v = vec![1, 2, 3];
println!("{}", v.len()); // 输出:3
println!("{}", v.is_empty()); // 输出:false
v.clear();
println!("{}", v.is_empty()); // 输出:true

四,字符串:

字符串是编程中最常见的数据类型之一,它们是字符的序列。在Rust中,字符串被设计为UTF-8编码,这意味着它们可以包含任何正确的UTF-8序列。Rust的字符串处理功能强大且灵活,但也有一些复杂性。

1,创建字符串:

在Rust中,可以使用多种方式创建字符串。最常见的方式是使用String::from函数,这将创建一个String类型的字符串。

let s = String::from("hello");

另一种方式是直接使用字符串字面量创建字符串,这将创建一个&str类型的字符串。

let s = "hello";

2,更新字符串:

Rust的String类型的字符串是可变的,可以使用push_strpush方法添加内容。

let mut s = String::from("hello");
s.push_str(", world"); // push_str方法接受字符串切片
s.push('!'); // push方法接受单个字符

3,字符串连接:

Rust提供了多种方式来连接字符串。最直接的方式是使用+运算符或format!宏。

let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; // 注意s1被移动了,不能再被使用let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = format!("{}{}", s1, s2); // s1和s2都没有被移动,可以继续使用

4,访问字符串内容:

由于Rust字符串是UTF-8编码的,所以不能简单地使用索引来访问单个字符。但是,可以使用迭代器来遍历字符串的每个字符。

let s = String::from("hello, world!");
for c in s.chars() {println!("{}", c);
}

5,字符串切片:

字符串切片是字符串的一部分,它的类型是&str。可以使用范围来创建字符串切片。

let s = String::from("hello, world!");
let hello = &s[0..5];
let world = &s[7..12];

6,字符串和其他类型的转换:

可以使用parse方法将字符串转换为其他类型,例如整数和浮点数。同样,也可以使用to_string方法将其他类型转换为字符串。

let s = "42";
let n: i32 = s.parse().unwrap();let n = 42;
let s = n.to_string();

五,结构体:

结构体(Struct)是Rust中的一种自定义数据类型,允许将多个相关的值,可能是不同类型的,组合在一起。结构体在Rust编程中非常重要,它们可以用来创建复杂的数据类型,以更好地模拟现实世界的对象和概念。

1,定义结构体

定义结构体需要使用struct关键字,后跟结构体的名称和一对大括号。在大括号内部,可以定义任意数量的字段,每个字段都需要有一个名称和一个类型。

struct Point {x: i32,y: i32,
}

在这个例子中,定义了一个名为Point的结构体,它有两个字段:xy,都是i32类型。

2,创建结构体实例

创建结构体实例需要使用结构体的名称,后跟一对大括号。在大括号内部,需要为每个字段提供一个值。

let p = Point { x: 0, y: 0 };

在这个例子中,创建了一个Point的实例p,并为xy字段分别赋值为0

3,访问结构体字段

访问结构体字段需要使用结构体实例的名称,后跟一个点号(.)和字段的名称。

let x = p.x;
let y = p.y;

在这个例子中,访问了pxy字段,并将它们的值分别赋给了xy变量。

4,修改结构体字段

如果需要修改结构体字段的值,需要首先将结构体实例声明为可变的。然后,可以使用结构体实例的名称,后跟一个点号(.)和字段的名称,来修改字段的值。

let mut p = Point { x: 0, y: 0 };
p.x = 5;
p.y = 10;

在这个例子中,首先创建了一个可变的Point实例p,然后修改了xy字段的值。

5,结构体更新语法

当需要创建一个新的结构体实例,且部分字段的值与已有实例相同时,可以使用结构体更新语法。这需要使用两个点号(…)后跟已有实例的名称。

let p1 = Point { x: 0, y: 0 };
let p2 = Point { x: 5, ..p1 };

在这个例子中,创建了一个新的Point实例p2,它的x字段的值为5y字段的值与p1y字段的值相同。

6,元组结构体

元组结构体是一种特殊的结构体,它的字段没有名称,只有类型。元组结构体的名称后跟一对小括号,小括号内部是字段的类型。

struct Color(i32, i32, i32);let white = Color(255, 255, 255);

在这个例子中,定义了一个名为Color的元组结构体,它有三个i32类型的字段。然后,创建了一个Color的实例white

7,单元结构体

单元结构体是一种特殊的结构体,它没有任何字段。单元结构体的名称后跟一个分号。

struct Unit;let u = Unit;

在这个例子中,定义了一个名为Unit的单元结构体。然后,创建了一个Unit的实例u

8,结构体所有权

结构体可以拥有其他类型的所有权。例如,可以在结构体中包含字符串类型的字段。

struct User {username: String,email: String,
}let user = User {username: String::from("user1"),email: String::from("user1@example.com"),
};

在这个例子中,定义了一个名为User的结构体,它有两个String类型的字段:usernameemail。然后,创建了一个User的实例user

结构体是Rust中的一种重要的数据结构,它可以用来创建复杂的数据类型,以更好地模拟现实世界的对象和概念。

总结:

本章详细介绍了Rust中的几种基本数据结构:元组,数组,向量,字符串,和结构体。这些数据结构在Rust编程中非常重要,理解和掌握它们是学习Rust的关键步骤。希望通过本章的学习,读者能够对这些数据结构有一个深入的理解,并能在实际编程中灵活运用。

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

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

相关文章

Redis-1

Redis 理论部分 redis 速度快的原因 1、纯内存操作 2、单线程操作&#xff0c;避免了频繁的上下文切换和资源争用问题&#xff0c;多线程需要占用更多的 CPU 资源 3、采用了非阻塞 I/O 多路复用机制 4、提供了非常高效的数据结构&#xff0c;例如双向链表、压缩页表和跳跃…

QT以管理员身份运行

以下配置后&#xff0c;QT在QT Creator调试时&#xff0c;或者生成的.exe程序&#xff0c;都将会默认以管理员身份运行。 一、MSVC编译器 1、在Pro文件中添加以下代码&#xff1a; QMAKE_LFLAGS /MANIFESTUAC:\"level\requireAdministrator\ uiAccess\false\\" …

纯css实现登录表单动效

效果图&#xff1a; 代码展示 // 我这边用的是elementUI表单校验&#xff0c;更改的样式。 <el-form:model"form":rules"rules"ref"fromList":hide-required-asterisk"true"><el-form-item prop"account"><…

全网最强,Python接口自动化测试实战-接口参数关联(购物实例)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是参数关联&a…

【2023年电赛国一必备】C题报告模板--可直接使用

任务 图1 任务内容 要求 图2 基本要求内容 图3 发挥部分内容 说明 图4 说明内容 评分标准 图5 评分内容 正文 &#xff08;部分&#xff09; 摘要 本实验基于TI公司的TM4C123GH6PM主控&#xff0c;结合OPA2337芯片和其他硬件模块&#xff0c;设计并制作了一种单相逆变器…

OceanBase上的泡泡玛特抽盒机,轻松应对百倍流量峰值

8月3日晚10点&#xff0c;近百万年轻人再次同时涌入泡泡玛特的抽盒机小程序&#xff0c;参加抢抽盲盒新品的狂欢。 每周四的这个时刻&#xff0c;都是对抽盒机系统的一次技术大考。这个考验不但影响着用户体验&#xff0c;也直接影响着泡泡玛特的业绩。据2022年年度财报&#…

EMS SQL Manager for MySQL Crack

EMS SQL Manager for MySQL Crack 用于MySQL的EMS SQL Manager是用于MySQL数据库管理和开发的高性能工具。它适用于4.1到最新版本的任何MySQL&#xff0c;并支持所有最新功能&#xff0c;包括MySQL触发器、视图、存储过程和函数、InnoDB外键、Unicode数据等。SQL Manager for M…

【java】【maven】【基础】MAVEN安装配置介绍

目录 1 下载 2 安装-windows为例 3 配置环境变量 3.1 JAVA_HOME 3.2 MAVEN_HOME 3.3 PATH 3.4 验证 4 MAVEN基础概念 4.1 仓库概念 4.2 坐标概念 4.2.1 打开网址 4.2.2 输入搜索内容junit 4.2.3 找到对应API名称点击 4.2.4 点击对应版本 4.2.5 复制MAVEN坐标 4.3 配置…

爬虫007_python中的输出以及格式化输出_以及输入---python工作笔记025

首先看输出 输出这里,注意不能直接上面这样,18需要转换成字符串 可以看到python中这个字符串和数字一起的时候,数字要转换一下成字符串. 然后这里要注意%s 和%d,这个s指的是字符串,d指的是数字 注意后面的内容前面要放个% ,然后多个参数的话,那么这里用(),里面用,号隔开 然…

windows服务器iis PHP套件出现FastCGI等错误解决方法汇总

如果您的服务器安装了PHP套件&#xff0c;出现了无法打开的情况&#xff0c;请参照如下办法解决&#xff1a; 首先&#xff0c;需要设置IIS允许输出详细的错误信息到浏览器&#xff0c;才好具体分析 错误一&#xff1a; 处理程序“FastCGI”在其模块列表中有一个错误模块“Fast…

新手用户选择阿里云服务器地域、实例、带宽、操作系统经验参考

无论是个人还是企业用户&#xff0c;部署自己的网站或者APP客户端、小程序等&#xff0c;都需要用到服务器&#xff0c;现在流行的都是使用云服务器&#xff0c;考虑到性价比大家现在都喜欢选择阿里云服务器。但是新手用户往往在面对阿里云服务器地域、实例、带宽、操作系统等众…

RTC晶振两端要不要挂电容

发现GD32的RTC晶振两端需要挂电容&#xff0c;STM32的RTC晶振两端不需要挂电容。 STM32的RTC晶振两端&#xff0c;不需要挂电容&#xff0c;这样晶振启振很容易&#xff0c;挂大了&#xff0c;却难启动&#xff0c;且温度越低&#xff0c;启动越难。 有人说负载电容为6pF的晶振…

SQL分类及通用语法数据类型

一、SQL分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据库…

Go语言开发者的Apache Arrow使用指南:读写Parquet文件

Apache Arrow是一种开放的、与语言无关的列式内存格式&#xff0c;在本系列文章[1]的前几篇中&#xff0c;我们都聚焦于内存表示[2]与内存操作[3]。 但对于一个数据库系统或大数据分析平台来说&#xff0c;数据不能也无法一直放在内存中&#xff0c;虽说目前内存很大也足够便宜…

SpringBoot

SpringBoot 微服务阶段 javase&#xff1a; OOPmysql&#xff1a;持久化htmlcssjsjquery框架javaweb&#xff1a;MVC 三层架构 的网站ssm&#xff1a;简化了开发流程 配置也相对复杂Spring&#xff1a;SpringBoot&#xff1a;内嵌Tomact 微服务架构springCloud SpringBoot S…

云原生全栈体系(二)

Kubernetes实战入门 第一章 Kubernetes基础概念 一、是什么 我们急需一个大规模容器编排系统kubernetes具有以下特性&#xff1a; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器&#xff0c;如果进入容器的流量很大&#xff0c;Kubernetes 可以负…

CSS调色网有哪些

本文章转载于湖南五车教育&#xff0c;仅用于学习和讨论&#xff0c;如有侵权请联系 1、https://webgradients.com/ Wbgradients 是一个在线调整渐变色的网站 &#xff0c;可以根据你想要的调整效果&#xff0c;同时支持复制 CSS 代码&#xff0c;可以更好的与开发对接。 Wbg…

经典CNN(三):DenseNet算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 前言 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为最主流的方法&#xff0c;比如GoogleNet&#xff0c;…

opencv 30 -图像平滑处理01-均值滤波 cv2.blur()

什么是图像平滑处理? 图像平滑处理&#xff08;Image Smoothing&#xff09;是一种图像处理技术&#xff0c;旨在减少图像中的噪声、去除细节并平滑图像的过渡部分。这种处理常用于预处理图像&#xff0c;以便在后续图像处理任务中获得更好的结果。 常用的图像平滑处理方法包括…

C++ 左值和右值

C 左值和右值 左值、右值左值引用、右值引用std::move()std::move()的实现引用折叠 完美转发forward()的实现函数返回值是左值还是右值如何判断一个值是左值还是右值 左值、右值 在C11中所有的值必属于左值、右值两者之一&#xff0c;右值又可以细分为纯右值、将亡值。在C11中…