exercises/05_vecs
vecs1.rs - 向量创建与宏
问题代码
fn array_and_vec() -> ([i32; 4], Vec<i32>) {
let a = [10, 20, 30, 40];
(a, v)
}
fn main() {
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_array_and_vec_similarity() {
let (a, v) = array_and_vec();
assert_eq!(a, *v);
}
}
解题要点
- 错误原因: 缺少向量
v 的定义,需要创建与数组相同元素的向量
- 解决方法: 使用
vec! 宏创建向量
正确写法
fn array_and_vec() -> ([i32; 4], Vec<i32>) {
let a = [10, 20, 30, 40];
let v = vec![10, 20, 30, 40];
(a, v)
}
fn main() {
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_array_and_vec_similarity() {
let (a, v) = array_and_vec();
assert_eq!(a, *v);
}
}
vecs2.rs - 向量操作与循环
问题代码
fn vec_loop(input: &[i32]) -> Vec<i32> {
let mut output = Vec::new();
for element in input {
}
output
}
fn main() {
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vec_loop() {
let input = [2, 4, 6, 8, 10];
let ans = vec_loop(&input);
assert_eq!(ans, [4, 8, 12, 16, 20]);
}
}
解题要点
- 错误原因: for 循环体为空,需要将每个元素乘以 2 并添加到输出向量
- 解决方法: 使用
push() 方法将处理后的元素添加到向量
正确写法
fn vec_loop(input: &[i32]) -> Vec<i32> {
let mut output = Vec::new();
for element in input {
output.push(element * 2);
}
output
}
fn main() {
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vec_loop() {
let input = [2, 4, 6, 8, 10];
let ans = vec_loop(&input);
assert_eq!(ans, [4, 8, 12, 16, 20]);
}
}
知识点汇总
向量基础
- 向量创建: 使用
vec! 宏创建向量,如 vec![1, 2, 3]
- 向量类型:
Vec<T> 表示可变长度的集合,T 为元素类型
- 向量初始化: 使用
Vec::new() 创建空向量
向量操作
- 添加元素: 使用
push() 方法向向量末尾添加元素
- 循环遍历: 使用
for 循环遍历向量元素
- 切片引用: 函数参数使用
&[i32] 接受数组或向量切片
向量特性
- 动态大小: 向量可以在运行时动态增长或缩小
- 内存管理: 向量在堆上分配内存,支持动态调整
- 类型推断: 编译器可以根据元素推断向量类型