知识点: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 类型(你已经自然接触到了!)
知识点
- vec!\[\] :创建动态数组(Vector),长度可以变化,必须 mut 才能增删、排序。
- .sort() :原地从小到大排序,直接修改 Vec,无返回值。
- .push(x) :尾部追加元素。
- .pop() :弹出尾部元素,返回 Option ,成功就是 Some(值) ,空向量时返回 None 。
- 遍历: for num in &v ,借用遍历,不拿走所有权。
- .contains(&值) :判断容器是否存在该元素,参数需要传引用。
数组(T;N) vs Vec(动态数组)小结
- 数组:长度编译期固定,不能变长变短;
- Vec:运行时长度可变,可以push/pop,相当于Python的list。