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

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]
}

相关文章:

Rust语言之集合

文章目录 一、元组&#xff08;tuple&#xff09;1.元组定义2.元组使用解构索引 3.元组修改非可变元组可变元组类型不一致 二、数组1.数组不可变数组定义可变数组定义数组使用数组修改数组的遍历 2.动态数组-向量&#xff08;Vector&#xff09;向量定义向量遍历向量追加向量插…...

有道论文翻译接口,python版和lua版

论文翻译接口python版 import requests import hashlib from urllib.parse import quotedef get_md5(s,is_hexTrue):md5hashlib.md5()md5.update(s.encode())if is_hex:return md5.hexdigest()return md5.digest()def translate(source_url,from_en,tozh-CHS):params {from: f…...

java大数据hadoop2.9.2 Flume安装操作

1、flume安装 &#xff08;1&#xff09;解压缩 tar -xzvf apache-flume-1.9.0-bin.tar.gz rm -rf apache-flume-1.9.0-bin.tar.gz mv ./apache-flume-1.9.0-bin/ /usr/local/flume &#xff08;2&#xff09;配置 cd /usr/local/flume/conf cp ./flume-env.sh.template…...

环境配置:Ubuntu18.04 ROS Melodic安装

前言 不同版本的Ubuntu与ROS存在对应关系。 ROS作为目前最受欢迎的机器人操作系统&#xff0c;其核心代码采用C编写&#xff0c;并以BSD许可发布。ROS起源于2007年&#xff0c;是由斯坦福大学与机器人技术公司Willow Garage合作的Switchyard项目。2012年&#xff0c;ROS团队从…...

2024.2.7-8 寒假训练记录(21)

文章目录 洛谷P3193 [HNOI2008] GT考试ATC abc339E Smooth SubsequenceATC abc339F Product Equality 洛谷P3193 [HNOI2008] GT考试 题目链接 KMPdp矩阵快速幂 还没有理解得很清楚&#xff0c;主要是对KMP理解还不够深刻 #include <bits/stdc.h>using namespace std;…...

C++ pair 的使用

pair的作用 C 中的 std::pair 是标准模板库 (STL) 提供的一个容器&#xff0c;它能够存储两个不同类型的数据作为一个整体&#xff0c;其中first&#xff1a;访问 pair 的第一个元素。second&#xff1a;访问 pair 的第二个元素。 int main() {pair<string, int> p;//通…...

AAAI 2024 | Adobe提出全新上下文提示学习框架CoPL,高效提升下游性能

论文题目&#xff1a;CoPL: Contextual Prompt Learning for Vision-Language Understanding 论文链接&#xff1a;https://arxiv.org/abs/2307.00910 提示学习&#xff08;Prompt Learning&#xff09;在近几年的快速发展&#xff0c;激活了以Transformer为基础的大型语言模型…...

Arcgis使用过程中常见问题解决方法

Arcgis无法连接数据库/数据库连接或创建失败解决方法 最近在使用arcgis过程中出现无法连接数据库或者是无法创建数据库。连接到数据库失败&#xff1b;无法创建新的数据库&#xff0c;权限被拒绝&#xff08;如下图&#xff09;。 出现这个原因是你所用的电脑系统文件dao360.…...

office文件转pdf在线预览

一、工具类 package com.sby.utils;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.Locale;import com.aspose.cel…...

设计模式2-对象池模式

对象池模式&#xff0c;Object Pool Pattern&#xff0c;当你的应用程序需要频繁创建和销毁某种资源&#xff08;比如数据库连接、线程、socket连接等&#xff09;时&#xff0c;Object Pool 设计模式就变得很有用。它通过预先创建一组对象并将它们保存在池中&#xff0c;以便在…...

Oracle笔记-为表空间新增磁盘(ORA-01691)

如下报错&#xff1a; 原因是Oracle表空间满了&#xff0c;最好是新增一个存储盘。 #查XXX命名空间目前占用了多大的空间 select FILE_NAME,BYTES/1024/1024 from dba_data_files where tablespace_name XXXX #这里的FILE_NAME能查到DBF的存储位置#将对应的datafile设置为30g…...

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

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

力扣-137. 只出现一次的数字 II

文章目录 力扣题目代码 力扣题目 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1&#xff1a;…...

Rust 格式化输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、format! 宏二、fmt::Debug三、fmt::Display四、? 操作符 循环打印 前言 Rust学习系列-本文根据教程学习Rust的格式化输出&#xff0c;包括fmt::Debug&…...

c#进程(Process)常用方法

在C#中&#xff0c;Process类提供了一系列用于操作进程的常用方法&#xff0c;以下是其中一些常用的方法&#xff1a; Start()&#xff1a;启动一个新的进程。 Process.Start("notepad.exe");Kill()&#xff1a;终止进程。 Process.GetProcessesByName("note…...

Vue源码系列讲解——虚拟DOM篇【三】(更新子节点)

1. 前言 在上一篇文章中&#xff0c;我们了解了Vue中的patch过程&#xff0c;即DOM-Diff算法。并且知道了在patch过程中基本会干三件事&#xff0c;分别是&#xff1a;创建节点&#xff0c;删除节点和更新节点。创建节点和删除节点都比较简单&#xff0c;而更新节点因为要处理…...

一个设备内存2M,一个1G大小的文件,这个文件有若干行,输出其中的带有hello的行以及行数

第一种 linux上的awk命令&#xff1a; awk {if($1 "113.111.211.224"){print $0}} temp.log 第二种&#xff1a;PHP程序yield &#xff0c;和awk这个命令用的时间差不多一样&#xff0c;效率是很高的 $file __DIR__."/temp.log";foreach(readfilecong…...

json模块(高维数据的存储与读取)

json模块是 Python 标准库中的一个模块&#xff0c;用于处理 JSON&#xff08;JavaScript Object Notation&#xff09;格式的数据。JSON是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。模块提供了在 Python 中进行 JSON 编码&…...

ONLYOFFICE文档8.0新功能浅探

ONLYOFFICE文档8.0新功能浅探 上个月末这个月初的几天&#xff0c;ONLYOFFICE版本更新了&#xff01;更新到了一个比较整的大的版本号&#xff0c;8.0版本&#xff0c;看来这个生产力工具的升级速度基本上能保持每年两个版本号的速度&#xff0c;还是很快的&#xff0c;一般来…...

在vscode 中配置 pyside6 环境

在vscode中编写pyside环境配置 start 记录一下在 vscode 中编写 pyside6 程序&#xff0c;环境如何配置。 前提 请自行安装好 python。请自行安装好 vscode。安装 vscode 插件 Python&#xff0c;PYQT Integration。 配置环境 1.借助 pip 安装我们的pyside6 pip install…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...