Rust-vec!与Vec::with_capacity初始化数组的区别

前言

这篇文章的实际上是对我在知乎上,下面这个问题的答案补充。
Rust能不能动态生成固定大小的数组(array)?

对于问题中的代码

fn main(){let n = 3;let mut arr:[i32; n] = [0;n] ; println!(":?", arr);
}

进行如下修改后,可以正常编译。

const LEN:usize = 3;
fn main() {let mut arr:[i32; LEN] = [0;LEN] ;println!("{:?}", arr);
}

所以,在Rust中,数组初始化时,使用的长度值应该是常量,且类型本身支持Copy trait。

因此,下面的内容将围绕两个方面来讨论

  • 数组的初始化长度
  • 数组元素的初始化

长度的初始化

在Rust中,数组的长度是固定的,因此,通过长度来初始化数组就这下面一种方式。

const LEN: uszie = 3;
let arr: [i32;LEN] = [0; LEN];

其实问题中的“动态”和“固定”这两个词本身就是矛盾的,但是我们可以通过Vec提供的功能来找到这个矛盾的平衡点。
代码如下:

fn main() {let n = 5;let items: &[i32] = &vec![0; n];let items1: &[i32] = &Vec::with_capacity(n);println!("items:{:?}", items);println!("items1:{:?}", items1);
}

打印结果如下:

items:[0, 0, 0, 0, 0]
items1:[]

可以发现items和items1的结果是不同的。

因此从内存分配的角度来看,使用vec!和Vec::with_capacity的区别如下:

  • vec!宏会根据提供的初始元素和长度,在堆上分配相应的内存空间,通过复制初始元素的方式来填充,存储这些元素。
  • Vec::with_capacity会在堆上分配相应的内存空间,但并没有向这个空间内填充任何元素。

数组元素的初始化

在通过vec![0;n]初始化数组时,数组元素的类型必须实现Copy trait,i32实现了Copy trait,因此通过vec![0;n]来初始化没有问题。但是如果数组元素是一个自定义的复杂类型(一般都没有实现Copy trait),就不能通过类似vec![0;n]这种方式来初始化数组了。

例如下面这段代码,Item没有实现Copy trait,因此初始化失败。

const LEN:usize = 3;
struct Item { name: String }
fn main() {let mut arr: [i32; LEN] = [0;LEN];let mut arr1: [Item; LEN] = [Item {name: "alan".to_string()};LEN];println!("{:?}", arr);
}

报错如下:

 --> src/main.rs:5:33|
5 |     let mut arr1:[Item; LEN] = [Item {name: "alan".to_string()};LEN] ;|                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `Item`|= note: the `Copy` trait is required because this value will be copied for each element of the array

这个时候,就可以通过Vec的push方法来向Vec中添加元素。好在我们事先通过with_capacity分配了内存空间,因此,在Vec长度小于n的情况下,向Vec中添加元素是不会再次分配内存空间。

 let mut vec3: Vec<Item> = Vec::with_capacity(n);vec3.push(Item {name: "Alan1".to_string(),});vec3.push(Item {name: "Alan2".to_string(),});vec3.push(Item {name: "Alan3".to_string(),});vec3.push(Item {name: "Alan4".to_string(),});vec3.push(Item {name: "Alan5".to_string(),});let items3: &[Item] = &vec3;

或者

let items4: &[Item] = &[Item {name: "Alan1".to_string(),},Item {name: "Alan2".to_string(),},Item {name: "Alan3".to_string(),},Item {name: "Alan4".to_string(),},Item {name: "Alan5".to_string(),},];

总结

在Rust中,数组的长度必须是常量,但是我们可以通过Vec提供的功能来实现“动态”初始化这个“常量”。

相同点

vec!和Vec::with_capacity都会根据设置的长度在堆上分配相应的内存空间;

不同点

Vec::with_capacity只会分配内存空间,但是不会填充值;vec!会通过复制初始值的方式来填充值;

这篇文章收录我的Rust-实战专栏。请关注我,不要错过更新哟。

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

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

相关文章

System学习笔记 - MacOs编译环境配置(一)

前言 好几年没有记录过东西&#xff0c;一是确实很忙&#xff0c;二是人也变懒了。新年开个新的学习计划&#xff0c;希望能坚持下去。 SystemC 简介 SystemC是一个建模语言&#xff0c;其本质是一个C的库&#xff0c;一般用于SoC建模&#xff0c;具体介绍不赘述&#xff0…

【学习记录】找最低位1/模块多次例化

一、找最低位1 要求&#xff1a;找出Nbit数据a中最低位1所在的位置&#xff0c;用onehot形式data_onehot表示 假设a1010_0100 将a减1&#xff0c;则可得最低位1后面所有数据为0的b,b1010_0011将b取反&#xff0c;得c,c0101_1100将a与c进行与操作&#xff0c;则可得 a&c 0…

CEEMDAN +组合预测模型(Transformer - BiLSTM+ ARIMA)

目录 往期精彩内容&#xff1a; 前言 1 风速数据CEEMDAN分解与可视化 1.1 导入数据 1.2 CEEMDAN分解 2 数据集制作与预处理 3 基于CEEMADN的 Transformer - BiLSTM 模型预测 3.1 定义CEEMDAN-Transformer - BiLSTM预测模型 3.2 设置参数&#xff0c;训练模型 4 基于A…

【Python学习】Python学习6-循环语句

目录 【Python学习】【Python学习】Python学习6-循环语句 前言for循环for循环示例通过序列索引迭代循环使用 else 语句 while循环while循环示例continue和 break无限循环循环使用 else 语句简单语句组 嵌套循环Python for 循环嵌套语法&#xff1a;Python while 循环嵌套语法&…

网络安全—IPSec安全策略

文章目录 网络拓扑添加策略ESP添加筛选器添加筛选器的操作另一台主机设置 AH 使用Windows Server 2003系统 网络拓扑 client1 IP 192.168.17.105client2 IP 192.168.17.106 只要保证两个主机在同一网段接口&#xff0c;即互相ping通即可完成策略的实现 下面的所有通讯都只是…

阿里云服务器ECS入门与基础运维

一、云服务器简介 1、服务器&#xff1a; (1) 概念&#xff1a; 服务器本身就是一种电脑&#xff0c;同样具备CPU、内存、硬盘、网卡、电源等硬件。 互联网对外提供网站、游戏、在线会议、网盘等服务&#xff0c;都需要将这些互联网服务部署到服务器中。 (2) 特点&#xf…

C语言编译器(C语言编程软件)完全攻略(第二十六部分:C-Free使用教程(使用C-Free编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 二十六、C-Free使用教程&#xff08;使用C-Free编写C语言程序&#xff09; 1、安装C-Free 5.0 C-Free 是一款国产的Windows下的C/C IDE&#xff0c;最新版本是 5.0&#xff0c;整个软件才 14M&#xff0c;非常轻巧&#xff0c;安装…

shell编程学习(二)

变量的类型 预定义变量 $$ 当前进程PID $? 命令执行后的返回状态.0 为执行正确&#xff0c;非 0 为执行错误 $# 位置参数的数量 $* 所有位置参数的内容 …

前端性能优化之图像优化

图像优化问题主要可以分为两方面&#xff1a;图像的选取和使用&#xff0c;图像的加载和显示。 图像基础 HTTP Archive上的数据显示&#xff0c;网站传输的数据中&#xff0c;60%的资源都是由各种图像文件组成的&#xff0c;当然这些是将各类型网站平均的结果&#xff0c;单独…

Mysql SQL审核平台Yearning本地部署

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发人员使用…

阿里云服务器公网带宽1M/3M/5M/10M/50M百兆下载速度表

阿里云服务器公网带宽上传和下载速度对照表&#xff0c;1M带宽下载速度是128KB/秒&#xff0c;为什么不是1M/秒&#xff1f;阿腾云atengyun.com分享阿里云服务器带宽1M、2M、3M、5M、6M、10M、20M、30M、50M、100M及200M等公网带宽下载和上传速度对照表&#xff0c;附带宽价格表…

C# Winform 在低DPI创建窗体后,在高DPI运行时,窗体会自动拉伸,导致窗体显示不全

C# Winform 在低DPI创建窗体后&#xff0c;在高DPI运行时&#xff0c;窗体会自动拉伸&#xff0c;导致窗体显示不全&#xff0c; 比如在分辨率为100% 的电脑创建C#项目&#xff0c;当运动到分辨率为125%的电脑运行时&#xff0c;后者运行的窗体会自动拉伸&#xff0c;窗体显示…

【linux学习笔记】网络

目录 【linux学习笔记】网络检查、监测网络ping-向网络主机发送特殊数据包traceroute-跟踪网络数据包的传输路径netstat-检查网络设置及相关统计数据 【linux学习笔记】网络 检查、监测网络 ping-向网络主机发送特殊数据包 最基本的网络连接命令就是ping命令。ping命令会向指…

Java二叉树的遍历以及最大深度问题

Java学习面试指南&#xff1a;https://javaxiaobear.cn 1、树的相关概念 1、树的基本定义 树是我们计算机中非常重要的一种数据结构&#xff0c;同时使用树这种数据结构&#xff0c;可以描述现实生活中的很多事物&#xff0c;例如家谱、单位的组织架构、等等。 树是由n&#…

VMware中找到存在但是不显示的虚拟机(彻底发现)VMware已创建虚拟机不显示

删除VMware中的虚拟机的时候&#xff0c;可能没有把虚拟机完全删除&#xff0c;或者说 “移除” 后找不到虚拟机在哪里&#xff0c;内存空间也没有得到释放&#xff0c;那该如何解决呢&#xff1f; 1.明确&#xff1a; “移除” 不等于 “从磁盘删除” 移除&#xff1a;只…

【IPC通信--socket套接字--心跳包】

Socket 心跳包 提高网络通信稳定性 随着网络通信技术的不断发展&#xff0c;网络通信已成为我们日常工作和生活中不可或缺的一部分。但是在使用网络通信的过程中&#xff0c;时常会遇到网络延迟、丢包等问题&#xff0c;这些问题不仅影响我们的工作和生活效率&#xff0c;也会…

【Pytorch】学习记录分享14——视频分析3D卷积

【Pytorch】学习记录分享14——视频分析3D卷积 1. 视频分析 3D卷积2. UCF101数据3. U3D算法 1. 视频分析 3D卷积 3D卷积的简介 在图像处理领域&#xff0c;被卷积的都是静态图像&#xff0c;所以使用2D卷积网络就足以。而在视频理解领域&#xff0c;为了同时保留时序信息&…

解决DolphinDB vscode插件重启后无法访问的问题

把vscode的代理关掉&#xff1a; 左下角小齿轮&#xff0c;打开setting搜索框里搜索proxy将Http:Proxy Support从override改为off&#xff0c;即可生效

python实现多进程和多线程

目录 一&#xff1a;介绍 二&#xff1a;多线程实现 三&#xff1a;多进程实现 一&#xff1a;介绍 Python 的多线程和多进程都是实现并发执行的方式&#xff0c;但它们有一些关键的区别&#xff1a; 线程共享进程的资源&#xff0c;而进程拥有自己的资源。这意味着线程之间…

Java SE入门及基础知识合集

Java SE入门及基础&#xff08;1&#xff09;&#xff1a;JavaSE入门及基础&#xff08;1&#xff09;-CSDN博客 Java SE入门及基础&#xff08;2&#xff09;&#xff1a;Java SE入门及基础&#xff08;2&#xff09;-CSDN博客 Java SE基础及入门&#xff08;3&#xff09;&…