Vec 动态数组
学习目标
- 创建和初始化 Vec
- 掌握增删改查操作
- 理解所有权和借用规则
- 掌握迭代器和常用方法
核心概念
创建 Vec
fn main() {
let v1: Vec<i32> = Vec::new();
let v2 = vec![1, 2, 3];
let v3 = vec![0; 10];
let v4 = Vec::with_capacity(100);
}
增删改查
fn main() {
let mut v = vec![1, 2, 3];
v.push(4);
v.insert(0, 0);
v.extend([5, 6, 7]);
v.pop();
v.remove(0);
v.retain(|&x| x > 2);
v.clear();
let mut v = vec![1, 2, 3];
v[0] = 10;
let first = v[0];
let safe = v.get(0);
let len = v.len();
let is_empty = v.is_empty();
let contains = v.contains(&2);
}
所有权
fn main() {
let mut v = vec![String::from("hello"), String::from("world")];
let first = &v[0];
println!("{}", first);
let first = v[0].clone();
let first = v.swap_remove(0);
println!("{}", first);
}
迭代
fn main() {
let v = vec![1, 2, 3, 4, 5];
for val in &v {
println!("{}", val);
}
let mut v = vec![1, 2, 3];
for val in &mut v {
*val *= 2;
}
let v = vec![1, 2, 3];
for val in v {
println!("{}", val);
}
}
常用方法
fn main() {
let mut v = vec![3, 1, 4, 1, 5, 9, 2, 6];
v.sort();
v.sort_by(|a, b| b.cmp(a));
v.sort_unstable();
v.sort();
v.dedup();
let slice = &v[1..4];
let (left, right) = v.split_at(3);
for window in v.windows(3) {
println!("{:?}", window);
}
for chunk in v.chunks(2) {
println!("{:?}", chunk);
}
let v = vec![1, 2, 3];
let sum: i32 = v.iter().sum();
let product: i32 = v.iter().product();
let max = v.iter().max();
let min = v.iter().min();
}
二维 Vec
fn main() {
let mut matrix = vec![vec![0; 4]; 3];
matrix[1][2] = 42;
println!("{:?}", matrix);
for (i, row) in matrix.iter().enumerate() {
for (j, &val) in row.iter().enumerate() {
print!("{:4}", val);
}
println!();
}
}
实践练习
练习 1:去重保序
fn dedup_ordered<T: PartialEq>(v: &mut Vec<T>) {
let mut i = 0;
while i < v.len() {
let mut j = i + 1;
while j < v.len() {
if v[i] == v[j] {
v.remove(j);
} else {
j += 1;
}
}
i += 1;
}
}
fn main() {
let mut v = vec![1, 3, 2, 3, 1, 4, 2];
dedup_ordered(&mut v);
println!("{:?}", v);
}
练习 2:矩阵转置
fn transpose(matrix: &Vec<Vec<i32>>) -> Vec<Vec<i32>> {
let rows = matrix.len();
let cols = matrix[0].len();
let mut result = vec![vec![0; rows]; cols];
for i in 0..rows {
for j in 0..cols {
result[j][i] = matrix[i][j];
}
}
result
}
fn main() {
let m = vec![
vec![1, 2, 3],
vec![4, 5, 6],
];
let t = transpose(&m);
println!("{:?}", t);
}
练习 3:滑动窗口最大值
fn max_sliding_window(v: &[i32], k: usize) -> Vec<i32> {
v.windows(k).map(|w| *w.iter().max().unwrap()).collect()
}
fn main() {
let data = vec![1, 3, -1, -3, 5, 3, 6, 7];
let result = max_sliding_window(&data, 3);
println!("{:?}", result);
}
常见错误
1. 越界访问
let v = vec![1, 2, 3];
let x = v.get(10);
2. 迭代时修改
let mut v = vec![1, 2, 3];
3. 移动出 Vec
let v = vec![String::from("hello")];
let s = v.into_iter().next().unwrap();
小结
| 操作 | 语法 |
|---|
| 创建 | vec![...], Vec::new() |
| 追加 | push, extend |
| 访问 | v[i], v.get(i) |
| 迭代 | for x in &v |
| 排序 | sort, sort_by |
| 过滤 | retain, iter().filter() |