【Rust练习】13.数组

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

1

rust 复制代码
fn main() {
    // 使用合适的类型填空
    let arr: __ = [1, 2, 3, 4, 5];

    // 修改以下代码,让它顺利运行
    assert!(arr.len() == 4);
}

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

rust 复制代码
fn main() {
    // 使用合适的类型填空
    let arr: [i32; 5] = [1, 2, 3, 4, 5];

    // 修改以下代码,让它顺利运行
    assert!(arr.len() == 5);
}

2

rust 复制代码
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) == __);
}

答案

rust 复制代码
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 🌟 数组中的所有元素可以一起初始化为同一个值

rust 复制代码
fn main() {
    // 填空
    let list: [i32; 100] = __ ;

    assert!(list[0] == 1);
    assert!(list.len() == 100);
}

答案

rust 复制代码
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 🌟 数组中的所有元素必须是同一类型

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

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

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

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

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

    assert!(ele == 'a');
}

答案

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

    assert!(ele == 'a');
}

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

rust 复制代码
// 修复代码中的错误
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也可以通过两种方式访问元素:

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

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

相关推荐
luj_176815 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
不听话坏15 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
mCell16 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
likeyi0716 小时前
require 和 import的区别
开发语言·前端
咖啡八杯16 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
远离UE416 小时前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬16 小时前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
KaMeidebaby17 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_176818 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
取地址符18 小时前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习