【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。
相关推荐
一隅论数智4 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本4 天前
离散数学第六课
学习·离散数学
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
AI职业加油站4 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊4 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型