rust数组
一、定义数组
(一)一维数组
1.指定所有元素
语法格式
let variable_name: [dataType; size] = [value1,value2,value3];
例如
let arr: [i32; 4] = [10,20,30,40];
2.指定初始值和长度
所有元素具有相同的值
语法格式
let variable_name: [dataType; size] = [value; size];
例如
let arr: [i32;4] = [-1;4];
注意
数组的长度必须在编译时就是已知的,而且编译后是固定不变的。因此声明数组时长度必须是整数字面量或者整数常量。
如果数组长度是一个变量,则会编译错误。例如下面的代码
fn main() {let N: usize = 20;let arr = [0; N]; //错误: non-constant used with constantprint!("{}",arr[10])
}
如果我们将 let 关键字修改为 const 关键字,编译就能通过了。
fn main() {const N: usize = 20;let arr = [0; N]; // 固定大小print!("{}",arr[10])
}
3.省略数组类型
let variable_name = [value1,value2,value3];
let variable_name = [value; size];
例如
let arr = [10,20,30,40];
let arr = [-1;4];
4.可变数组
在上面几种方式基础上添加mut关键字。
例子
fn main(){let mut arr:[i32;4] = [10,20,30,40];arr[1] = 0;println!("{:?}",arr);
}
输出结果如下
[10, 0, 30, 40]
(二)二维数组
1.指定所有元素
语法格式
let var: [[type; size1]; size2] = [[value1, value2...], ...];
例子
let directions: [[i32; 2]; 4] = [[-1, 0], [0, 1], [0, 1], [1, 0]];
2.指定初始值和长度
语法格式
let var: [[type; size1]; size2] = [[value; size1]; size2];
例子
let directions: [[i32; 2]; 4] = [[0; 2]; 4];
3.省略类型
语法格式
let var = [[value1, value2...], ...];
let var = [[value; size1]; size2];
例子
let directions = [[-1, 0], [0, 1], [0, 1], [1, 0]];
let directions = [[0u8; 4]; 4];
4.可变二维数组
在上面几种方式基础上添加mut
数组分配在栈上,但Rust中,栈的大小是有限制的。比如Linux下默认为8M,Windows下默认为2M。这太小了不够用。我们可以利用Box,将数组分配到堆上。
二、使用数组
(一)数组长度len()
len()用于返回数组的长度。
例子
fn main() {let arr:[i32;4] = [-1;4];println!("{}",arr.len());let directions: [[i32; 2]; 4] = [[0; 2]; 4];println!("{} {}", directions.len(), directions[0].len());
}
输出结果如下
4
4 2
(二)访问数组元素
let mut nums1 = [1; 5];
nums1[1] = 4;
println!("{}", nums1[1]);
(三)遍历数组
1.使用索引
let mut nums1 = [1; 5];
for i in 0..nums1.len() {println!("{} ", nums1[i]);
}
for i in 0..nums1.len() {nums1[i] = i;
}
println!("{:?}", nums1);
2.直接使用数组
for num in nums1 {print!("{} ", num);
}
println!();
3.使用数组的引用
let mut nums1 = [1; 5];
let mut i = 0;
for num in &nums1 {print!("{} ", num);
}
println!();
for num in &mut nums1 {*num = i;i += 1;
}
println!("{:?}", nums1);
4.使用数组的迭代器
iter()返回一个只读迭代器
for num in nums1.iter() {print!("{} ", num);
}
println!();
iter_mut()返回一个可写迭代器
let mut nums1 = [1; 5];
let mut i = 0;
for num in nums1.iter_mut() {*num = i;i += 1;
}
println!("{:?}", nums1);
into_iter()返回一个迭代器,但是转让所有权
let mut nums1 = [1; 5];
for num in nums1.into_iter() {print!("{} ", num);
}
println!();
for num in nums1
实际上等价于
for num in nums1.into_iter()
5.使用迭代器的enumerate
let mut nums1 = [1; 5];
for (pos, v) in nums1.iter().enumerate() {println!("nums[{}]={}", pos, v);
}
println!("{:?}", nums1);
for (pos, v) in nums1.iter_mut().enumerate() {*v=pos;println!("nums[{}]={}", pos, v);
}
println!("{:?}", nums1);
二维数组遍历:
1.使用索引
let mut grid = [[0; 5]; 5];
for i in 0..grid.len() {for j in 0..grid[i].len() {grid[i][j] = j;print!("{} ", grid[i][j]);}println!();
}
2.使用引用
let mut grid = [[0; 5]; 5];
for row in &grid {for col in row {print!("{} ", col);}println!();
}
let mut i = 0;
for row in &mut grid{for col in row {*col = i;i += 1;print!("{} ", col);}println!();
}
3.使用迭代器
let mut grid = [[0; 5]; 5];
for row in grid.iter() {for col in row.iter() {print!("{} ", col);}println!();
}
let mut i = 0;
for row in grid.iter_mut(){for col in row.iter_mut() {*col = i;i += 1;print!("{} ", col);}println!();
}
4.使用迭代器的enumerate
let mut grid = [[0; 5]; 5];
for (i, row) in grid.iter().enumerate() {for (j, col) in row.iter().enumerate() {print!("{}", col);}println!()
}
for (i, row) in grid.iter_mut().enumerate() {for (j, col) in row.iter_mut().enumerate() {*col = 1;}
}
(四)转换数组
pub fn map<F, U>(self, f: F) -> [U; N]
where
F: FnMut(T) -> U,
返回一个相同长度的数组,它的元素是由原数组元素应用f函数得到的。
如果您需要动态大小的向量,请使用Iterator::map。
关于性能和栈使用的注意事项
尽量避免在大数组上使用此方法。还要尽量避免连续使用map (例如arr.map(…).map(…))。
尽量使用Iterator::map,只有真正需要一个大小相同的新数组时,才使用[T; N]::map。
例子
let x = [1, 2, 3];
let y = x.map(|v| v + 1);
assert_eq!(y, [2, 3, 4]);
let x = [1, 2, 3];
let mut temp = 0;
let y = x.map(|v| { temp += 1; v * temp });
assert_eq!(y, [1, 4, 9]);
let x = ["Ferris", "Bueller's", "Day", "Off"];
let y = x.map(|v| v.len());
assert_eq!(y, [6, 9, 3, 3]);
(五)数组排序
因为数组能隐式转换成切片,所以切片的方法,数组都能使用。
sort()与sort_unstable()
首选sort_unstable,因为它比sort()快,并且不分配辅助内存。
例子
let mut v = [-5, 4, 1, -3, 2];
v.sort();
assert!(v == [-5, -3, 1, 2, 4]);
sort_by()与sort_unstable_by()
指定比较函数
首选sort_unstable_by(),因为它比sort_by()快,并且不分配辅助内存。
例子
let mut v = [5, 4, 1, 3, 2];
v.sort_by(|a, b| a.cmp(b));
assert!(v == [1, 2, 3, 4, 5]);
// 反向排序
v.sort_by(|a, b| b.cmp(a));
assert!(v == [5, 4, 3, 2, 1]);
sort_by_key()与sort_unstable_by_key()
指定键函数
首选sort_unstable_by_key(),因为它比sort_by_key()快,并且不分配辅助内存。
例子
let mut v = [-5i32, 4, 1, -3, 2];
v.sort_by_key(|k| k.abs());
assert!(v == [1, 2, -3, 4, -5]);
(七)其他常用方法
分割数组
let (part1, part2) = [1,2,3,4,5].split_at(2);
println!("part1={:?}", part1);//[1,2]
println!("part2={:?}", part2);//[3,4,5]交换数组元素
let mut arr = [1,2,3,4];
arr.swap(1,2);
println!("arr: {:?}", arr);//[1, 3, 2, 4]逆转数组
arr.reverse();
println!("arr: {:?}", arr);//[4, 2, 3, 1]//二分查找
let index: Result<usize, usize> = [1,2,3,4,5].binary_search(&4);
//index: Ok(3)
println!("index: {:?}", index);最后一个元素
let last_elem: Option<&i32> = [1,2,3,4,5].last();
//last elem: Some(5)
println!("last elem: {:?}", last_elem);数组求和
let array: [i32; 10] = [1; 10];
assert_eq!(10, array.iter().sum::<i32>());
(八)数组作为函数参数
数组可以作为函数的参数。而传递方式有 传值传递 和 引用传递 两种方式。
传值传递 就是传递数组的一个副本给函数做参数,函数对副本的任何修改都不会影响到原来的数组。
引用传递 就是传递数组在内存上的位置给函数做参数,因此函数对数组的任何修改都会影响到原来的数组。
范例:传值传递
fn main() {let arr = [10,20,30];update(arr);println!("Inside main {:?}",arr);
}
fn update(mut arr:[i32;3]){for i in 0..3 {arr[i] = 0;}println!("Inside update {:?}",arr);
}
编译运行结果如下
Inside update [0, 0, 0]
Inside main [10, 20, 30]
范例2: 引用传递
fn main() {let mut arr = [10,20,30];update(&mut arr);println!("Inside main {:?}",arr);
}
fn update(arr:&mut [i32;3]){for i in 0..3 {arr[i] = 0;}println!("Inside update {:?}",arr);
}
编译运行结果如下
Inside update [0, 0, 0]
Inside main [0, 0, 0]
相关文章:
rust数组
一、定义数组 (一)一维数组 1.指定所有元素 语法格式 let variable_name: [dataType; size] [value1,value2,value3];例如 let arr: [i32; 4] [10,20,30,40];2.指定初始值和长度 所有元素具有相同的值 语法格式 let variable_name: [dataType; siz…...
ubuntu | 安装NVIDIA套件:驱动、CUDA、cuDNN
CUDA 查看支持最高的cuda版本 nvidia-smiCUDA Version:12.2 区官网下在12.2.x最新的版本即可CUDA Toolkit Archive | NVIDIA Developer 下载安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo…...
JAVA学习笔记
一、学习要点 java的最大优势就是跨平台; java的三个版本,javaSE标准版本,javaEE企业版本,javaME微型版本(用的比较少); JVM(Java Virtual Machine,Java虚拟机); JRE…...
车载软件架构 —— 持续集成持续交付
车载软件架构 —— 持续集成持续交付 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 对学习而言,学习之后的思考、思考之后的行动、行动之后的改变更重要,如果不盯住内层的改变量,那么在表层投…...
c++ 二元运算符重载, 以加法为例
/* * c 二元运算符重载, 以加法为例 */ #include <stdio.h> class Complex { public: int r0; // real, 实部 int v0; //virtual, 虚部 }; // 重载加法 操作符 // 可见,c2元运算符,取其左侧为第一参数,右侧为第二参数 // 返回值可以付给新的变量 C…...
基于 SpringBoot+Vue的电影影城管理系统,附源码,数据库
文章目录 第一章 简介第二章 技术栈第三章 功能分析第四章 系统设计第5章 系统详细设计六 源码咨询 第一章 简介 本影城管理系统,是基于 Java SpringBoot 开发的。主要包括二大功能模块,即用户功能模块和管理员功能模块。 (1)管…...
Docker实战技巧(二):Kubernetes基础操作实战
Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题 1、关闭防火墙并设置开机禁用 systemctl stop firewalld systemctl disable firewalld 2、配置repo cd /etc/yum.repos.d/ 下载Docker repo wget https://mirrors.aliyun.com/docker-…...
计算机视觉与深度学习-循环神经网络与注意力机制-Attention(注意力机制)-【北邮鲁鹏】
目录 引出Attention定义Attention-based model通俗解释应用在图像领域图像字幕生成(image caption generation)视频处理 序列到序列学习:输入和输出都是长度不同的序列 引出Attention 传统的机器翻译是,将“机器学习”四个字都学…...
Centos7安装wps无法打开及字体缺失的问题解决
在centos7上安装了最新的wps2019版本的wps-office-11.1.0.11704-1.x86_64.rpm,生成了桌面图标并信任,可以新建文件,但是软件无法打开。在终端执行如下命令,用命令行启动wps: cd /opt/kingsoft/wps-office/office6/ ./…...
华为OD机试真题-会议接待-2023年OD统一考试(B卷)
题目描述: 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1、一个团只能上一辆车,并且代表团人数(代表团数量小于30,每个代表团人数小于30)小于…...
mysql explain学习记录
参考了公司内相关博客,实践并记录下,为后面分析并优化索引做准备。 MySQL explain命令是查看MySQL查询优化器如何执行查询的主要方法,可以很好的分析SQL语句的执行情况。 每当遇到执行慢(在业务角度)的SQL,…...
电压放大电路的作用有哪些(电压放大器)
电压放大电路是电子电路中常见且重要的组件,其主要作用是将输入信号的电压放大到所需的输出电压级别,并保持输入信号的形状和准确度。电压放大电路广泛应用于各种电子设备和系统中,具有以下几个重要的作用: 信号放大:电…...
编译opencv-3.4.5 [交叉编译]
在unbuntu20.04环境下编译opencv3.4.5, cmake 版本:3.27.4 gcc 版本:11.4.0 g版本:11.4.0 在此环境下编译opencv4.5.4正常。 1. 编译时遇到的问题 (1) Built target libprotobuf make: *** [Makefile:163…...
Canal 实现MySQL与Elasticsearch7数据同步
1 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump协议 MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal ) canal 解析 binary log 对象(原始为 byte 流) 优点&…...
网络安全攻防对抗之隐藏通信隧道技术整理
完成内网信息收集工作后,渗透测试人员需要判断流量是否出得去、进得来。隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。 一、隐藏通信隧道基础知识 (一)隐藏通信隧道概述 一般的网络通…...
读书笔记:多Transformer的双向编码器表示法(Bert)-2
多Transformer的双向编码器表示法 Bidirectional Encoder Representations from Transformers,即Bert; 第2章 了解Bert模型(掩码语言模型构建和下句预测) 文本嵌入模型Bert,在许多自然语言处理任务上表现优秀&#…...
Python 基于PyCharm断点调试
视频版教程 Python3零基础7天入门实战视频教程 PyCharm Debug(断点调试)可以帮助开发者在代码运行时进行实时的调试和错误排查,提高代码开发效率和代码质量。 准备一段代码 def add(num1, num2):return num1 num2if __name__ __main__:f…...
spring security auth2.0实现
OAuth 2.0 的认证/授权流程 jwt只是认证中的一步 4中角色 资源拥有者(resource owner)、客户端(client 第三方)、授权服务器(authorization server)和资源服务器(resource server)。…...
MySQL(6)LOCK和MVCC
一、锁的分类 按照锁的属性:读锁、写锁、共享锁、排它锁、悲观锁、乐观锁 按照锁的范围:表锁、页锁、间隙锁、临键锁、行锁 按照锁的作用:意向锁、意向共享锁、意向排它锁、IS锁、IX锁 二、MySQL为什么要有锁 锁是计算机协调多个进程或线程并…...
最新IDE流行度最新排名(每月更新)
2023年09月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多,这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧,Top IDE索引可以帮助您决定在软件开发项目中使用哪个IDE …...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
