【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。
相关推荐
AI视觉网奇1 小时前
blende 下载安装学习笔记
笔记·学习
卢锡荣1 小时前
单芯掌控多口互联|乐得瑞 LDR6020 PD3.1 多通道 Type‑C 控制 SOC 芯片
c语言·开发语言
2333!!!!!1 小时前
rocket新手一些常见问题
java·开发语言
yume_sibai1 小时前
02-Rust 所有权与借用深入解析(底层原理 + 借用检查器 + 生命周期 + 内部可变性)
开发语言·后端·rust
是翎1 小时前
Vibe Coding零基础入门:六步工作流拆解
大数据·人工智能·学习·机器学习·数据挖掘
xxwxx__1 小时前
深入理解 C++ STL:stack、queue 与 deque 从使用到底层实现全解析
开发语言·c++·算法
Highcharts.js1 小时前
甘特图纵向任务、横向时间显示图表可视化开发|Highcharts甘特图示例
开发语言·前端·javascript·可视化·甘特图·数据可视化·highcharts
my05921 小时前
市场学习,不止看资讯,数据查阅与思维练习同样重要
python·学习
郝学胜-神的一滴1 小时前
C++11 工程级应用 08:Lambda表达式与Tuple元组
开发语言·jvm·c++·python·程序人生·开源