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

【Rust练习】13.数组

练习题来自:https://practice-zh.course.rs/compound-types/array.html

1

fn main() {// 使用合适的类型填空let arr: __ = [1, 2, 3, 4, 5];// 修改以下代码,让它顺利运行assert!(arr.len() == 4);
}

显然这个数组的长度是5.

fn main() {// 使用合适的类型填空let arr: [i32; 5] = [1, 2, 3, 4, 5];// 修改以下代码,让它顺利运行assert!(arr.len() == 5);
}

2

fn main() {// 很多时候,我们可以忽略数组的部分类型,也可以忽略全部类型,让编译器帮助我们推导let arr0 = [1, 2, 3];let arr: [_; 3] = ['a', 'b', 'c'];// 填空// 数组分配在栈上, `std::mem::size_of_val` 函数会返回整个数组占用的内存空间// 数组中的每个 char 元素占用 4 字节的内存空间,因为在 Rust 中, char 是 Unicode 字符assert!(std::mem::size_of_val(&arr) == __);
}

答案

fn main() {let arr0 = [1, 2, 3];let arr: [_; 3] = ['a', 'b', 'c'];assert!(std::mem::size_of_val(&arr) == 12);
}

Rust的定长数组倒是和C语言的很像,但是每个C程序员都知道,C的数组本质其实是指向第一个元素的指针。

3 🌟 数组中的所有元素可以一起初始化为同一个值

fn main() {// 填空let list: [i32; 100] = __ ;assert!(list[0] == 1);assert!(list.len() == 100);
}

答案

fn main() {// 填空let list: [i32; 100] = [1;100] ;assert!(list[0] == 1);assert!(list.len() == 100);
}

对于C/C++的数组来说,并没有一步到位批量初始化的写法,只有C++特有的vector才有。我看了下后面的语法,Rust的数组应该也是纯编译期的数据结构,栈上分配嘛。C语言原生的动态数组malloc/free的写法应该是没有。

4 🌟 数组中的所有元素必须是同一类型


fn main() {// 修复错误let _arr = [1, 2, '3'];
}

没什么说的,不是同一个类型的也不需要使用数组这种结构。

fn main() {// 修复错误let _arr = [1, 2, 3];
}

5 🌟 数组的下标索引从 0 开始

fn main() {let arr = ['a', 'b', 'c'];let ele = arr[1]; // 只修改此行来让代码工作assert!(ele == 'a');
}

答案

fn main() {let arr = ['a', 'b', 'c'];let ele = arr[0]; // 只修改此行来让代码工作assert!(ele == 'a');
}

6 🌟 越界索引会导致代码的 panic.

// 修复代码中的错误
fn main() {let names = [String::from("Sunfei"), "Sunface".to_string()];// `get` 返回 `Option<T>` 类型,因此它的使用非常安全let name0 = names.get(0).unwrap();// 但是下标索引就存在越界的风险了let _name1 = &names[2];
}

C语言原生的数组是没有越界检查的,索引到哪里就把哪里内存里的数据取出来。C++的vector对标的应该是Rust的Vec,其实不适合在这里说,但我还是说一下:

vector也可以通过两种方式访问元素:

int x = myVector[0]; // 获取第一个元素
int y = myVector.at(1); // 获取第二个元素

其中方括号的方法和C数组类似,但at会判断越界,越界时会抛出一个异常。

http://www.lryc.cn/news/433690.html

相关文章:

  • 直流负载技术介绍
  • FPGA低功耗设计
  • Python Opencv: 基于颜色提取的印章分割
  • Codeforces Round 970 (Div. 3)(ABCDEF)
  • springboot基于ssm+Jsp的人才招聘网站系统的设计与实现 jw2cs
  • 高质量共建“一带一路”!苏州金龙助力非洲交通驶向共同繁荣之旅
  • 嵌入式初学-C语言-数据结构--四
  • 【HarmonyOS 4】应用性能优化
  • MySQL——表操作
  • 阅读笔记--Guiding Attention in End-to-End Driving Models(二)
  • Linux: network: TCP: errno: EWOULDBLOCK
  • 闲话“设计模式”
  • Sentence-BERT实现文本匹配【CoSENT损失】
  • 业余考什么证书比较实用?
  • 16款facebook辅助工具,总有一款适合你!
  • 给网站发外链的好处,你了解多少?
  • 安卓链接正常显示,ios#符被转义%23导致链接访问404
  • excel分列
  • STM32 HAL DMA 中断碰到的问题
  • 让树莓派智能语音助手实现定时提醒功能
  • AIoTedge边缘计算+边缘物联网平台
  • Java使用拷贝asset文件,解密,并用DexclassLoader加载执行
  • 【AcWing】861. 二分图的最大匹配(匈牙利算法)
  • 经验笔记:JSP(JavaServer Pages)
  • 【零基础必看的数据库教程】——SQL WHERE 子句
  • vscode docker debug python
  • 【Kubernetes】常见面试题汇总(四)
  • MATLAB基础语法知识
  • PopupInner源码分析 -- ant-design-vue系列
  • Maven 的 pom.xml 文件中<dependency> 元素及其各个参数的解释