【Rust入门知识点学与练】第9课:Vec 动态数组

知识点:Vec --- 可以增长和缩小的数组

普通数组长度固定,而 Vec 可以在运行时动态添加、删除元素:

rust 复制代码
fn main() {
    // 创建空的 Vec(需要标注类型)
    let mut fruits: Vec<&str> = Vec::new();

    // 添加元素
    fruits.push("苹果");
    fruits.push("香蕉");
    fruits.push("橘子");
    println!("{:?}", fruits);  // ["苹果", "香蕉", "橘子"]

    // 长度
    println!("长度: {}", fruits.len());  // 3

    // 通过索引访问
    println!("第一个: {}", fruits[0]);  // 苹果

    // 删除最后一个元素
    let last = fruits.pop();
    println!("删除了: {:?}", last);     // Some("橘子")
    println!("现在: {:?}", fruits);     // ["苹果", "香蕉"]

    // 用 for 遍历
    for fruit in &fruits {
        println!("水果: {}", fruit);
    }

    // 用 vec! 宏快速创建(推荐)
    let numbers = vec![10, 20, 30, 40, 50];
    println!("{:?}", numbers);

    // 检查是否包含某个元素
    println!("包含20? {}", numbers.contains(&20));  // true

    // 排序(需要 mut)
    let mut nums = vec![3, 1, 4, 1, 5, 9];
    nums.sort();
    println!("排序后: {:?}", nums);  // [1, 1, 3, 4, 5, 9]
}

核心规则

操作 写法

创建空 Vec Vec::new()

快速创建 vec!1, 2, 3

添加元素 v.push(值)

删除末尾 v.pop()

长度 v.len()

访问 v0

包含 v.contains(&值)

排序 v.sort()

遍历 for x in &v { ... }

动手试试

补全下面的代码:

rust 复制代码
fn main() {
    // 补全:用 vec! 宏创建一个 Vec,包含 [5, 3, 8, 1, 9, 2]
    // 打印原始数组
    // 期望输出: 原始: [5, 3, 8, 1, 9, 2]

    // 补全:对这个 Vec 排序,然后打印
    // 期望输出: 排序后: [1, 2, 3, 5, 8, 9]

    // 补全:用 push 添加元素 7 和 4,然后打印
    // 期望输出: 添加后: [1, 2, 3, 5, 8, 9, 7, 4]

    // 补全:用 pop 删除最后一个元素,打印被删除的值和剩余数组
    // 期望输出:
    // 删除了: Some(4)
    // 剩余: [1, 2, 3, 5, 8, 9, 7]

    // 补全:用 for 循环计算剩余数组的总和并打印
    // 期望输出: 总和: 35

    // 补全:检查数组中是否包含 8,打印结果
    // 期望输出: 包含8? true
}

期望输出:

原始: 5, 3, 8, 1, 9, 2

排序后: 1, 2, 3, 5, 8, 9

添加后: 1, 2, 3, 5, 8, 9, 7, 4

删除了: Some(4)

剩余: 1, 2, 3, 5, 8, 9, 7

总和: 35

包含8? true

写好了贴过来,没问题就进入第10课:Option 和 Result(错误处理入门) 👋

贴代码

rust 复制代码
fn main() {
    // 补全:用 vec! 宏创建一个 Vec,包含 [5, 3, 8, 1, 9, 2]
    // 打印原始数组
    // 期望输出: 原始: [5, 3, 8, 1, 9, 2]
    let mut v = vec![5, 3, 8, 1, 9, 2];
    println!("原始: {:?}", v);

    // 补全:对这个 Vec 排序,然后打印
    // 期望输出: 排序后: [1, 2, 3, 5, 8, 9]
    v.sort();
    println!("排序后: {:?}", v);

    // 补全:用 push 添加元素 7 和 4,然后打印
    // 期望输出: 添加后: [1, 2, 3, 5, 8, 9, 7, 4]
    v.push(7);
    v.push(4);
    println!("添加后: {:?}", v);

    // 补全:用 pop 删除最后一个元素,打印被删除的值和剩余数组
    // 期望输出:
    // 删除了: Some(4)
    // 剩余: [1, 2, 3, 5, 8, 9, 7]
    let removed = v.pop();
    println!("删除了: {:?}", removed);
    println!("剩余: {:?}", v);

    // 补全:用 for 循环计算剩余数组的总和并打印
    // 期望输出: 总和: 35
    let mut sum = 0;
    for num in &v {
        sum += num;
    }
    println!("总和: {}", sum);

    // 补全:检查数组中是否包含 8,打印结果
    // 期望输出: 包含8? true
    let has_eight = v.contains(&8);
    println!("包含8? {}", has_eight);
}

评语

完全正确!👏

你掌握了:

vec! 宏创建动态数组

push / pop 添加和删除元素

sort 排序、 contains 查找

pop 返回 Option 类型(你已经自然接触到了!)

知识点

  1. vec!\[\] :创建动态数组(Vector),长度可以变化,必须 mut 才能增删、排序。
  2. .sort() :原地从小到大排序,直接修改 Vec,无返回值。
  3. .push(x) :尾部追加元素。
  4. .pop() :弹出尾部元素,返回 Option ,成功就是 Some(值) ,空向量时返回 None 。
  5. 遍历: for num in &v ,借用遍历,不拿走所有权。
  6. .contains(&值) :判断容器是否存在该元素,参数需要传引用。

数组(T;N) vs Vec(动态数组)小结

  • 数组:长度编译期固定,不能变长变短;
  • Vec:运行时长度可变,可以push/pop,相当于Python的list。
相关推荐
唐钰小宝B4 小时前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows
2603_969579284 小时前
U盘的系统备份怎样还原系统?详细步骤与注意事项
学习
知识分享小能手5 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
熊猫钓鱼>_>5 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
Meteors.5 小时前
Android Compose学习02:基础组件与 Modifier
android·学习
张张123y5 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
小陈不好吃5 小时前
Java 泛型与类型擦除:从 PECS 原则到 TypeToken 绕过
java·开发语言·windows·pecs 原则·typetoken绕过
Shaoshing5 小时前
存储引擎与架构
java·开发语言·架构
额额额对了6 小时前
Linux 驱动开发:基于 platform 总线 + misc 设备的 DS18B20 单总线温度驱动
linux·c语言·开发语言·驱动开发·嵌入式硬件
m4Rk_6 小时前
【论文阅读】Agent 记忆机制(102):UMA——用多个未来问题端到端训练一份共享记忆
论文阅读·人工智能·学习·开源·github