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语言之集合
文章目录 一、元组(tuple)1.元组定义2.元组使用解构索引 3.元组修改非可变元组可变元组类型不一致 二、数组1.数组不可变数组定义可变数组定义数组使用数组修改数组的遍历 2.动态数组-向量(Vector)向量定义向量遍历向量追加向量插…...
有道论文翻译接口,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安装 (1)解压缩 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 (2)配置 cd /usr/local/flume/conf cp ./flume-env.sh.template…...
环境配置:Ubuntu18.04 ROS Melodic安装
前言 不同版本的Ubuntu与ROS存在对应关系。 ROS作为目前最受欢迎的机器人操作系统,其核心代码采用C编写,并以BSD许可发布。ROS起源于2007年,是由斯坦福大学与机器人技术公司Willow Garage合作的Switchyard项目。2012年,ROS团队从…...
2024.2.7-8 寒假训练记录(21)
文章目录 洛谷P3193 [HNOI2008] GT考试ATC abc339E Smooth SubsequenceATC abc339F Product Equality 洛谷P3193 [HNOI2008] GT考试 题目链接 KMPdp矩阵快速幂 还没有理解得很清楚,主要是对KMP理解还不够深刻 #include <bits/stdc.h>using namespace std;…...
C++ pair 的使用
pair的作用 C 中的 std::pair 是标准模板库 (STL) 提供的一个容器,它能够存储两个不同类型的数据作为一个整体,其中first:访问 pair 的第一个元素。second:访问 pair 的第二个元素。 int main() {pair<string, int> p;//通…...
AAAI 2024 | Adobe提出全新上下文提示学习框架CoPL,高效提升下游性能
论文题目:CoPL: Contextual Prompt Learning for Vision-Language Understanding 论文链接:https://arxiv.org/abs/2307.00910 提示学习(Prompt Learning)在近几年的快速发展,激活了以Transformer为基础的大型语言模型…...
Arcgis使用过程中常见问题解决方法
Arcgis无法连接数据库/数据库连接或创建失败解决方法 最近在使用arcgis过程中出现无法连接数据库或者是无法创建数据库。连接到数据库失败;无法创建新的数据库,权限被拒绝(如下图)。 出现这个原因是你所用的电脑系统文件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-对象池模式
对象池模式,Object Pool Pattern,当你的应用程序需要频繁创建和销毁某种资源(比如数据库连接、线程、socket连接等)时,Object Pool 设计模式就变得很有用。它通过预先创建一组对象并将它们保存在池中,以便在…...
Oracle笔记-为表空间新增磁盘(ORA-01691)
如下报错: 原因是Oracle表空间满了,最好是新增一个存储盘。 #查XXX命名空间目前占用了多大的空间 select FILE_NAME,BYTES/1024/1024 from dba_data_files where tablespace_name XXXX #这里的FILE_NAME能查到DBF的存储位置#将对应的datafile设置为30g…...
【专业技术】高效并行分布式深度学习策略,助力模型训练与量化
尊敬的客户,您好!我们是一家专注于提供高效深度学习解决方案的专业团队,为您提供并行分布式策略、高效精调策略、大模型无损量化和高性能推理服务。 我们的服务包括: 并行分布式策略:我们的Trainer封装支持多种并行配…...
力扣-137. 只出现一次的数字 II
文章目录 力扣题目代码 力扣题目 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1:…...
Rust 格式化输出
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、format! 宏二、fmt::Debug三、fmt::Display四、? 操作符 循环打印 前言 Rust学习系列-本文根据教程学习Rust的格式化输出,包括fmt::Debug&…...
c#进程(Process)常用方法
在C#中,Process类提供了一系列用于操作进程的常用方法,以下是其中一些常用的方法: Start():启动一个新的进程。 Process.Start("notepad.exe");Kill():终止进程。 Process.GetProcessesByName("note…...
Vue源码系列讲解——虚拟DOM篇【三】(更新子节点)
1. 前言 在上一篇文章中,我们了解了Vue中的patch过程,即DOM-Diff算法。并且知道了在patch过程中基本会干三件事,分别是:创建节点,删除节点和更新节点。创建节点和删除节点都比较简单,而更新节点因为要处理…...
一个设备内存2M,一个1G大小的文件,这个文件有若干行,输出其中的带有hello的行以及行数
第一种 linux上的awk命令: awk {if($1 "113.111.211.224"){print $0}} temp.log 第二种:PHP程序yield ,和awk这个命令用的时间差不多一样,效率是很高的 $file __DIR__."/temp.log";foreach(readfilecong…...
json模块(高维数据的存储与读取)
json模块是 Python 标准库中的一个模块,用于处理 JSON(JavaScript Object Notation)格式的数据。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。模块提供了在 Python 中进行 JSON 编码&…...
ONLYOFFICE文档8.0新功能浅探
ONLYOFFICE文档8.0新功能浅探 上个月末这个月初的几天,ONLYOFFICE版本更新了!更新到了一个比较整的大的版本号,8.0版本,看来这个生产力工具的升级速度基本上能保持每年两个版本号的速度,还是很快的,一般来…...
在vscode 中配置 pyside6 环境
在vscode中编写pyside环境配置 start 记录一下在 vscode 中编写 pyside6 程序,环境如何配置。 前提 请自行安装好 python。请自行安装好 vscode。安装 vscode 插件 Python,PYQT Integration。 配置环境 1.借助 pip 安装我们的pyside6 pip install…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...
mcts蒙特卡洛模拟树思想
您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...
今日行情明日机会——20250609
上证指数放量上涨,接近3400点,个股涨多跌少。 深证放量上涨,但有个小上影线,相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析(基于最新图片数据) 1. 医药(11家涨停) 代表标…...
