Rust语言之集合

文章目录

  • 一、元组(tuple)
    • 1.元组定义
    • 2.元组使用
      • 解构
      • 索引
    • 3.元组修改
      • 非可变元组
      • 可变元组
      • 类型不一致
  • 二、数组
    • 1.数组
      • 不可变数组定义
      • 可变数组定义
      • 数组使用
      • 数组修改
      • 数组的遍历
    • 2.动态数组-向量(Vector)
      • 向量定义
      • 向量遍历
      • 向量追加
      • 向量插入
      • 向量删除
        • remove方法
        • pop方法-删除最好一个元素
        • truncate方法-缩减向量
        • clear方法-清空向量
        • drain方法-删除范围内向量
      • 向量排序
        • sort方法
        • sort_by方法
      • 逆转向量


Rust官方文档

针对集合Rust提供了两种复合数据类型,元组和数组。

一、元组(tuple)

元组(tuple)是一种复合数据类型,可以包含不同类型的元素,但一旦定义,元组长度不可变的。

1.元组定义

# 标准定义
fn main() {let tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");
}
# 也可省略类型
fn main() {let tup= (500, 6.4, 1, "hello");
}

2.元组使用

Rust中使用元组数据有两种方法。

  • 解构 即将一个元组拆成多个部分,每个部分赋值给一个变量
  • 索引 即使用’.'配合索引进行使用

解构

fn main() {let tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");let (a,b,c,d) = tup;println!("a={0},b={1},c={2},d={3}",a,b,c,d);
}
$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.34sRunning `target/debug/hello hello`
a=500,b=6.4,c=1,d=hello

索引

fn main() {let tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");println!("a={0},b={1},c={2},d={3}",tup.0,tup.1,tup.2,tup.3);
}
$argo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.31sRunning `target/debug/hello hello`
a=500,b=6.4,c=1,d=hello

3.元组修改

理论上元组是不能进行修改的,但是如果定义为可变元组,则可以修改元组内容,但修改值的类型必须和定义时一致。

特别注意:元组长度始终无法修改

非可变元组


fn main() {let  tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");println!("value:{}",tup.0);tup.0 = 1000;println!("After:{}",tup.0);
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)
error[E0594]: cannot assign to `tup.0`, as `tup` is not declared as mutable--> src/main.rs:4:5|
4 |     tup.0 = 1000;|     ^^^^^^^^^^^^ cannot assign|
help: consider changing this to be mutable|
2 |     let  mut tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");|          +++For more information about this error, try `rustc --explain E0594`.
error: could not compile `hello` (bin "hello") due to previous error

可变元组

fn main() {let mut tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");println!("value:{}",tup.0);tup.0 = 1000;println!("After:{}",tup.0);
}
$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.22sRunning `target/debug/hello hello`
value:500
After:1000

类型不一致

fn main() {let mut tup: (i32, f64, u8, &str) = (500, 6.4, 1, "hello");println!("value:{}",tup.0);tup.0 = "what?";println!("After:{}",tup.0);
}
$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)
error[E0308]: mismatched types--> src/main.rs:4:13|
4 |     tup.0 = "what?";|     -----   ^^^^^^^ expected `i32`, found `&str`|     ||     expected due to the type of this bindingFor more information about this error, try `rustc --explain E0308`.
error: could not compile `hello` (bin "hello") due to previous error

二、数组

目前据我所知,Rust中可以称为数组的有可变数组、不可变数组和向量.

  • 数组只能是单一数据类型的合集,比元组多了遍历的功能
  • 向量与数组一样,是单一数据类型的合计,但是比数组强大太多,具有增、删、插入、排序等操作

1.数组

不可变数组定义

# 标准定义方法
fn main() {let a: [i32; 5] = [1, 2, 3, 4, 5];
}=> a =[1, 2, 3, 4, 5]
# 简化类型定义方法
fn main() {let a = [1, 2, 3, 4, 5];
}=> a =[1, 2, 3, 4, 5]
# 相同初始值定义方法
fn main() {let a = [3; 5];
}=> a =[3, 3, 3, 3, 3]

可变数组定义

定义方法与不可变数组一致,只是加了mut关键字

fn main() {let mut v: [i32; 5] = [3;5];
}=> a =[3, 3, 3, 3, 3]

数组使用

可以利用数组名[下标]的方式对数组内容进行使用,数组内下标从0计算。

fn main() {  let array = [1, 2, 3, 4, 5];  println!("Second value:{:?}", array[1]);  
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.24sRunning `target/debug/hello hello`
Second value:2

数组修改

fn main() {  let mut array = [1, 2, 3, 4, 5];  println!("value :{:?}", array);  array[2] = 100;println!("After :{:?}", array);  
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.22sRunning `target/debug/hello hello`
value :[1, 2, 3, 4, 5]
After :[1, 2, 100, 4, 5]

数组的遍历

# 值遍历
fn main() {  let array = [1, 2, 3, 4, 5];  for i in array{println!("{}",i);}
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.24sRunning `target/debug/hello hello`
1
2
3
4
5# 下标遍历
fn main() {  let array = [1, 2, 3, 4, 5];  for i in 0..5{println!("{}",array[i]);}
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.21sRunning `target/debug/hello hello`
1
2
3
4
5

2.动态数组-向量(Vector)

Rust中的向量(Vector)是一种动态数组,它可以存储相同类型的元素,并且其大小可以在运行时增长或缩小。

向量定义

let mut v1 = Vec::new(); // 创建一个空的向量  
let v2 = vec![1, 2, 3]; // 创建一个包含初始元素的向量

向量遍历

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

向量追加

 fn main() {  let mut v = Vec::new();v.push(1);v.push(2);v.push(3);println!("{:?}",v);
}$cargo run helloFinished dev [unoptimized + debuginfo] target(s) in 0.00sRunning `target/debug/hello hello`
[1, 2, 3]

向量插入

fn main() {  let mut vec = vec![1, 2, 4, 5];  vec.insert(2, 3); // 在索引2的位置插入元素3  println!("{:?}", vec);
}$cargo run helloCompiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)Finished dev [unoptimized + debuginfo] target(s) in 0.26sRunning `target/debug/hello hello`
[1, 2, 3, 4, 5]

向量删除

remove方法
fn main() {  let mut vec = vec![1, 2, 3, 4, 5];  let removed_element = vec.remove(2); // 删除索引2处的元素  println!("Removed element: {}", removed_element); // 输出: Removed element: 3  println!("{:?}", vec); // 输出: [1, 2, 4, 5]
}
pop方法-删除最好一个元素
fn main() {  let mut vec = vec![1, 2, 3];vec.pop();println!("{:?}", vec); // 输出: [1, 2]
}
truncate方法-缩减向量
fn main() {  let mut vec = vec![1, 2, 3, 4, 5];  vec.truncate(3); // 缩减向量的大小为3  println!("{:?}", vec); // 输出: [1, 2, 3]
}
clear方法-清空向量
fn main() {  let mut vec = vec![1, 2, 3, 4, 5];  vec.clear(); // 删除所有元素  println!("{:?}", vec); // 输出: []
}
drain方法-删除范围内向量
fn main() {  let mut vec = vec![1, 2, 3, 4, 5];  let drained: Vec<_> = vec.drain(1..3).collect(); // 删除索引1到2的元素(不包括3)并收集它们  println!("Drained elements: {:?}", drained); // 输出: Drained elements: [2, 3]  println!("{:?}", vec); // 输出: [1, 4, 5]
}

向量排序

sort方法
fn main() {  let mut numbers = vec![5, 2, 9, 1, 5, 6];  numbers.sort();  println!("{:?}", numbers); // 输出: [1, 2, 5, 5, 6, 9]
}
sort_by方法
# 升序
fn main() {  let mut numbers = vec![5, 2, 9, 1, 5, 6];  numbers.sort_by(|a, b| a.cmp(b));  println!("{:?}", numbers); // 输出: [1, 2, 5, 5, 6, 9]
}
# 降序
fn main() {  let mut numbers = vec![5, 2, 9, 1, 5, 6];  numbers.sort_by(|a, b| b.cmp(a));  println!("{:?}", numbers); // 输出: [9, 6, 5, 5, 2, 1]
}

逆转向量

fn main() {  let mut numbers = vec![1, 2, 3, 4, 5];  numbers.reverse();  println!("{:?}", numbers); // 输出: [5, 4, 3, 2, 1]
}

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

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

相关文章

MongoDB聚合: $sort

聚合的$sort阶段对所有输入文件进行排序&#xff0c;并按排序顺序返回管道。 语法 { $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }$sort阶段参数为一个文档&#xff0c;该文档指定了要排序的字段和相应的排序顺序。<sort or…

[职场] 公安管理学就业方向及前景 #媒体#笔记#笔记

公安管理学就业方向及前景 公安管理学是中国普通高等学校本科专业。本专业文理兼收&#xff0c;学制4年&#xff0c;授予法学学士学位。本专业培养掌握马克思主义基本原理&#xff0c;政治坚定&#xff0c;坚持党和国家的路线、方针、政策&#xff0c;具有良好职业素养、科学素…

获取视频帧图片

在实现了minio文件上传的基础上进行操作 一、编写pom <dependency><groupId>org.jcodec</groupId><artifactId>jcodec</artifactId><version>0.2.5</version> </dependency> <dependency><groupId>org.jcodec<…

【小程序】基础API——面板API接口介绍

ty.preloadPanel 面板预下载 需引入BizKit&#xff0c;且在>3.0.0版本才可使用 参数 Object object 属性类型默认值必填说明deviceIdstring是设备 idextraInfoPanelExtraParams否额外面板信息 当预下载的是二级面板时, 需要传递的额外信息completefunction否接口调用结束…

PMP考试之20240209

1、生物制药公司ClinicaLabs的一位项目经理打算与她的经理讨论为其团队无法执行的复杂活动获取额外资源的问题。一旦活动完成&#xff0c;这些资源将立即投入项目。在这种情况下&#xff0c;项目经理最需要以下哪项技能&#xff1f; A.确定资源需求的规划技能 B.使经理相信她…

git恢复rebase过程中遇到权限问题和丢失的提交

文章目录 一、检查丢失的提交是否还在 reflog 中二、创建一个新分支来恢复丢失的提交三、处理权限问题四. 使用 git fsck 查找丢失对象1、创建一个新分支来恢复该提交2、检查和合并提交 五. 介绍git中命令reflog 与 fsck1、git reflog2、git fsck使用场景 一、检查丢失的提交是…

freesql orm 使用 DynamicFilterInfo 拼接日期查询条件时间格式一个难得的经验

文本到时间条件的转换 前端输入 1253-3 , 后台提示"varchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值" 经查询, mssql 【datetime】数据类型&#xff1a;最大是9999年12 月31日&#xff0c;最小是1753年1月1日 所以要拼接限制一下, 只是 if (val.…

迅为RK3588开发板ubuntu和window互传图形界面直接拖拽进行文件传输

确保以及安装了 VMware Tools。如下图所示表示已安装过了。 和 windows 端文件夹间传输一样直接拖拽进去即可&#xff0c;如下图所示&#xff1a; 也可拖拽到终端&#xff0c;如下图所示&#xff1a; 更多内容可以B站搜索迅为RK3588开发板

什么是系统工程(字幕)22

0 00:00:00,650 --> 00:00:02,660 那么下一个呢&#xff0c;就是 1 00:00:03,200 --> 00:00:04,770 图16.12 2 00:00:05,740 --> 00:00:07,910 这是一个活动图 3 00:00:09,090 --> 00:00:11,930 表达了蒸馏这个水的 4 00:00:12,280 --> 00:00:13,470 过程的…

一文彻底搞懂Redis的内存回收机制和内存过期淘汰策略

文章目录 1. Redis内存回收机制2. Redis过期策略3. Redis淘汰策略3.1 LRU算法3.2 缓存清理配置3.3 Redis数据淘汰策略3.4 缓存清理的流程 4. 总结 关于 Redis 内存回收机制和内存过期淘汰策略的常见问题&#xff1a; 什么是 Redis 的内存回收机制&#xff1f; Redis 的内存回收…

百家cms代审

环境搭建 源码链接如下所示 https://gitee.com/openbaijia/baijiacms 安装至本地后 直接解压到phpstudy的www目录下即可 接下来去创建一个数据库用于存储CMS信息。&#xff08;在Mysql命令行中执行&#xff09; 接下来访问CMS&#xff0c;会默认跳转至安装界面 数据库名称和…

原根primitive root

&#xff08;a,m&#xff09;1&#xff0c;若,则称a为模N的原根。 以下程序只能判断结果为简化剩余系情况下的模N的原根。 对于模4的primitive_root3,模9的primitive_root2,5这些情况无法判断。 def find_primitive_root(n):for base in range(1,n):l[]for index in range(…

uni使用openlayer加载本机离线地图

manifest.json添加配置 "runmode": "liberate"(默认为normal) 把地图打包进apk&#xff0c;这样手机每次访问地图就可以访问到工程文件夹的地图资源了&#xff0c;不用每次都请求云资源&#xff0c;消耗流量太大了

分治法求解最大子数组和问题

leetcode 53 53. 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 #define max(a,b) ((a)>(b)?(a):(b)) int maxSubArr…

Huggingface上传模型

Huggingface上传自己的模型 参考 https://juejin.cn/post/7081452948550746148https://huggingface.co/blog/password-git-deprecationAdding your model to the Hugging Face Hub&#xff0c; huggingface.co/docs/hub/ad…Welcome&#xff0c;huggingface.co/welcome三句指…

【数据结构】排序之冒泡排序和快速排序

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 交换排序1.1 冒泡排序1.2 快速排序1.3 快速排序优化1.4 快速排序非递归 1. 交换排序 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换…

【力扣每日一题】力扣236二叉树的最近公共祖先

题目来源 力扣236二叉树的最近公共祖先 题目概述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的…

VUE2和VUE3区别对比一览

## Vue3总结 ### 官方文档 * [Vue3](https://v3.cn.vuejs.org/api/options*data.html) * [Vue2](https://vuejs.bootcss.com/api/) ### Vue3相对于Vue2的语法特性#### 1.获取数据 * vue2 javascript export default {data() {return {name: myName,}},mounted() {console.log(t…

【专业技术】高效并行分布式深度学习策略,助力模型训练与量化

尊敬的客户&#xff0c;您好&#xff01;我们是一家专注于提供高效深度学习解决方案的专业团队&#xff0c;为您提供并行分布式策略、高效精调策略、大模型无损量化和高性能推理服务。 我们的服务包括&#xff1a; 并行分布式策略&#xff1a;我们的Trainer封装支持多种并行配…

LangChain pdf的读取以及向量数据库的使用

以下使用了3399.pdf&#xff0c; Rockchip RK3399 TRM Part1 import ChatGLM from langchain.chains import LLMChain from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain.chains import Simp…