【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。
相关推荐
该学习了咕咕11 小时前
顶刊论文学习笔记
学习
来让爷抱一个13 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
Linux-lucky13 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
li星野13 小时前
【学习记录】k-Wave 时间步长、CFL 稳定性与参数实验全解析
学习
心祭丫丫15 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪16 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
yeccheng18 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
联犀18 小时前
纯 Go 的 CAD 开源库 go-cad:直接解析 DWG/DXF,现在也能导出 PDF
开发语言·golang·pdf
Nerd(BUG版)18 小时前
Flutter学习day5--事件手势与命中测试
学习·flutter
zjxtxdy19 小时前
C++面向对象程序开发-类与对象
开发语言·c++