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

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数组

一、定义数组 &#xff08;一&#xff09;一维数组 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的最大优势就是跨平台&#xff1b; java的三个版本&#xff0c;javaSE标准版本&#xff0c;javaEE企业版本&#xff0c;javaME微型版本&#xff08;用的比较少&#xff09;&#xff1b; JVM(Java Virtual Machine&#xff0c;Java虚拟机)&#xff1b; JRE…...

车载软件架构 —— 持续集成持续交付

车载软件架构 —— 持续集成持续交付 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 对学习而言,学习之后的思考、思考之后的行动、行动之后的改变更重要,如果不盯住内层的改变量,那么在表层投…...

c++ 二元运算符重载, 以加法为例

/* * c 二元运算符重载&#xff0c; 以加法为例 */ #include <stdio.h> class Complex { public: int r0; // real, 实部 int v0; //virtual, 虚部 }; // 重载加法 操作符 // 可见,c2元运算符,取其左侧为第一参数,右侧为第二参数 // 返回值可以付给新的变量 C…...

基于 SpringBoot+Vue的电影影城管理系统,附源码,数据库

文章目录 第一章 简介第二章 技术栈第三章 功能分析第四章 系统设计第5章 系统详细设计六 源码咨询 第一章 简介 本影城管理系统&#xff0c;是基于 Java SpringBoot 开发的。主要包括二大功能模块&#xff0c;即用户功能模块和管理员功能模块。 &#xff08;1&#xff09;管…...

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通俗解释应用在图像领域图像字幕生成&#xff08;image caption generation&#xff09;视频处理 序列到序列学习&#xff1a;输入和输出都是长度不同的序列 引出Attention 传统的机器翻译是&#xff0c;将“机器学习”四个字都学…...

Centos7安装wps无法打开及字体缺失的问题解决

在centos7上安装了最新的wps2019版本的wps-office-11.1.0.11704-1.x86_64.rpm&#xff0c;生成了桌面图标并信任&#xff0c;可以新建文件&#xff0c;但是软件无法打开。在终端执行如下命令&#xff0c;用命令行启动wps&#xff1a; cd /opt/kingsoft/wps-office/office6/ ./…...

华为OD机试真题-会议接待-2023年OD统一考试(B卷)

题目描述: 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1、一个团只能上一辆车,并且代表团人数(代表团数量小于30,每个代表团人数小于30)小于…...

mysql explain学习记录

参考了公司内相关博客&#xff0c;实践并记录下&#xff0c;为后面分析并优化索引做准备。 MySQL explain命令是查看MySQL查询优化器如何执行查询的主要方法&#xff0c;可以很好的分析SQL语句的执行情况。 每当遇到执行慢&#xff08;在业务角度&#xff09;的SQL&#xff0c;…...

电压放大电路的作用有哪些(电压放大器)

电压放大电路是电子电路中常见且重要的组件&#xff0c;其主要作用是将输入信号的电压放大到所需的输出电压级别&#xff0c;并保持输入信号的形状和准确度。电压放大电路广泛应用于各种电子设备和系统中&#xff0c;具有以下几个重要的作用&#xff1a; 信号放大&#xff1a;电…...

编译opencv-3.4.5 [交叉编译]

在unbuntu20.04环境下编译opencv3.4.5&#xff0c; cmake 版本&#xff1a;3.27.4 gcc 版本&#xff1a;11.4.0 g版本&#xff1a;11.4.0 在此环境下编译opencv4.5.4正常。 1. 编译时遇到的问题 &#xff08;1&#xff09; Built target libprotobuf make: *** [Makefile:163…...

Canal 实现MySQL与Elasticsearch7数据同步

1 工作原理 canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &#xff0c;向 MySQL master 发送 dump协议 MySQL master 收到 dump 请求&#xff0c;开始推送 binary log 给 slave (即 canal ) canal 解析 binary log 对象(原始为 byte 流) 优点&…...

网络安全攻防对抗之隐藏通信隧道技术整理

完成内网信息收集工作后&#xff0c;渗透测试人员需要判断流量是否出得去、进得来。隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。 一、隐藏通信隧道基础知识 &#xff08;一&#xff09;隐藏通信隧道概述 一般的网络通…...

读书笔记:多Transformer的双向编码器表示法(Bert)-2

多Transformer的双向编码器表示法 Bidirectional Encoder Representations from Transformers&#xff0c;即Bert&#xff1b; 第2章 了解Bert模型&#xff08;掩码语言模型构建和下句预测&#xff09; 文本嵌入模型Bert&#xff0c;在许多自然语言处理任务上表现优秀&#…...

Python 基于PyCharm断点调试

视频版教程 Python3零基础7天入门实战视频教程 PyCharm Debug&#xff08;断点调试&#xff09;可以帮助开发者在代码运行时进行实时的调试和错误排查&#xff0c;提高代码开发效率和代码质量。 准备一段代码 def add(num1, num2):return num1 num2if __name__ __main__:f…...

spring security auth2.0实现

OAuth 2.0 的认证/授权流程 jwt只是认证中的一步 4中角色 资源拥有者&#xff08;resource owner&#xff09;、客户端&#xff08;client 第三方&#xff09;、授权服务器&#xff08;authorization server&#xff09;和资源服务器&#xff08;resource server&#xff09;。…...

MySQL(6)LOCK和MVCC

一、锁的分类 按照锁的属性&#xff1a;读锁、写锁、共享锁、排它锁、悲观锁、乐观锁 按照锁的范围&#xff1a;表锁、页锁、间隙锁、临键锁、行锁 按照锁的作用&#xff1a;意向锁、意向共享锁、意向排它锁、IS锁、IX锁 二、MySQL为什么要有锁 锁是计算机协调多个进程或线程并…...

最新IDE流行度最新排名(每月更新)

2023年09月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&#xff0c;Top IDE索引可以帮助您决定在软件开发项目中使用哪个IDE …...

I2C的上拉电阻如何计算?

说明&#xff1a; 1、本文只说明I2C上拉电阻的最小值如何计算。 2、I2C最小值和最大值计算的详细原理可以参考这篇文章&#xff1a;https://mp.weixin.qq.com/s/ZvJJ0rPRd_STULj8g1H81A。 3、I2C最小值的计算方式比较简单&#xff0c;在实际应用中计算出最小值&#xff0c;然后…...

Centos下安装 oracle11g 博客2

[oraclewangmengyuan database]$ ./runInstaller -silent -responseFile /home/oracle/database/response/db_install.rsp -ignorePrereq ./runInstaller -silent -responseFile /home/oracle/database/response/db_install.rsp -ignorePrereq 正在启动 Oracle Universal Insta…...

记一次逆向某医院挂号软件的经历

背景 最近家里娃需要挂专家号的儿保&#xff0c;奈何专家号实在过于抢手&#xff0c;身为程序员的我也没有其他的社会资源渠道可以去弄个号&#xff0c;只能发挥自己的技术力量来解决这个问题了。 出师不利 首先把应用安装到我已经 Root 过的 Pixel 3 上面&#xff0c;点击应…...

Canal实现Mysql数据同步至Redis、Elasticsearch

文章目录 1.Canal简介1.1 MySQL主备复制原理1.2 canal工作原理 2.开启MySQL Binlog3.安装Canal3.1 下载Canal3.2 修改配置文件3.3 启动和关闭 4.SpringCloud集成Canal4.1 Canal数据结构![在这里插入图片描述](https://img-blog.csdnimg.cn/c64b40c2231a4ea39a95aac81d771bd1.pn…...

Kafka的消息传递保证和一致性

前言 通过前面的文章&#xff0c;相信大家对Kafka有了一定的了解了&#xff0c;那接下来问题就来了&#xff0c;Kafka既然作为一个分布式的消息队列系统&#xff0c;那它会不会出现消息丢失或者重复消费的情况呢&#xff1f;今天咱们就来一探。 实现机制 Kafka采用了一系列机…...

Docker 部署 Firefly III 服务

拉取最新版本的 Firefly III 镜像&#xff1a; $ sudo docker pull fireflyiii/core:latest在本地预先创建好 upload 和 export 目录, 用于映射 Firefly III 容器内的 /var/www/html/storage/upload 和 /var/www/html/storage/export 目录。 使用以下命令来运行 Firefly III …...

配置OSPFv3基本功能 华为笔记

1.1 实验介绍 1.1.1 关于本实验 OSPF协议是为IP协议提供路由功能的路由协议。OSPFv2&#xff08;OSPF版本2&#xff09;是支持IPv4的路由协议&#xff0c;为了让OSPF协议支持IPv6&#xff0c;技术人员开发了OSPFv3&#xff08;OSPF版本3&#xff09;。 无论是OSPFv2还是OSPFv…...

【AI视野·今日Sound 声学论文速览 第九期】Thu, 21 Sep 2023

AI视野今日CS.Sound 声学论文速览 Thu, 21 Sep 2023 Totally 1 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;Auto-ACD,大规模文本-音频数据集自动生成方法。 基于现有的大模型和api构建了一套大规模高质量的音频文本数据收集方法&#xff0c…...

数据结构-----堆(完全二叉树)

目录 前言 一.堆 1.堆的概念 2.堆的存储方式 二.堆的操作方法 1.堆的结构体表示 2.数字交换接口函数 3.向上调整&#xff08;难点&#xff09; 4.向下调整&#xff08;难点&#xff09; 5.创建堆 6.堆的插入 7.判断空 8.堆的删除 9.获取堆的根(顶)元素 10.堆的遍历…...

set/multiset容器、map容器

目录 set/multiset容器 set基本概念 set大小和交换 set插入和删除 查找和统计 set和multiset的区别 改变set排序规则 set存放内置数据类型 set存放自定义数据类型 pair队组 map容器 map容器的基本概念 map构造和赋值 map大小和交换 map插入和删除 map查找和统计…...

高大上企业网站/常见的网络推广方式有哪些

已知x^2/(x^41)1/3,求x^4/(x^8x^41)的值以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;已知x^2/(x^41)1/3,求x^4/(x^8x^41)的值由已知得&#xff1a;x^43x^2-1則x^89x^4-6x^2127x^2-9-6x^21…...

先做产品网站还是app/山西seo推广

http://zh.wikipedia.org/wiki/%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8Fhttp://blog.163.com/zxzx5200126/blog/static/1861288420082280929954 变量类型说明%ALLUSERSPROFILE%局部返回所有“用户配置文件”的位置。%APPDATA%局部返回默认情况下应用程序存储数据的位置。%CD%局部…...

visual composer wordpress.org/谷歌排名规则

https://blog.csdn.net/hexf9632/article/details/93469788...

网站建设总体需求分析/网站seo哪里做的好

【本周总结】 1.学习了js红宝书的第四章&#xff1a;基本类型和引用类型的值、执行环境、垃圾收集 2.总结了js红宝书前三章内容 3.学习了ps的一些工具&#xff1a;油漆桶工具、橡皮擦工具、修饰工具、选框工具、套索工具、快速选择工具组、直方图和明暗调整、图层和调整图层 4…...

网站首页导航栏怎么做/百度在线提问

苏生不惑第133 篇原创文章&#xff0c;将本公众号设为星标&#xff0c;第一时间看最新文章。今天就是 520 了&#xff0c;还没对象的朋友看看我之前的文章 听说 520 你还没对象&#xff0c;来这里看看关于b站之前已经写过了下列文章&#xff1a;那些我关注的 b 站 up 主bilibil…...

保定医疗网站建设公司/济南网站优化排名推广

一、前言 刚刚有一个好友向我咨询数据相关的问题&#xff0c;朋友目前是IT设备生产厂商的人。从好友的描述中&#xff0c;提到对用户特征获取的需求。包括&#xff1a;人的兴趣爱好、关注焦点等&#xff0c;在用户的描述中其实只是直觉性的列决出了几点&#xff0c;然后基于此作…...