Rust中如何反转向量的子向量?解决类型注解问题
解决Rust中
Vec<Vec<u32>>子向量反转的类型问题 问题分析
你的代码存在两个核心问题:
rows.iter()返回的是不可变引用迭代器(Iterator<Item=&Vec<u32>>),而reverse()方法需要可变引用(&mut Vec<u32>)才能原地修改向量。reverse()的返回值是()(空单元类型),不是反转后的向量,因此map后的迭代器元素类型是(),无法通过collect()得到Vec<Vec<u32>>。
解决方案
根据需求选择以下两种方案之一:
方案1:原地修改原向量
如果不需要保留原数据,直接修改rows中的子向量:
fn main() { let mut rows: Vec<Vec<u32>> = Vec::from([ Vec::from([1, 2, 3]), Vec::from([4, 5, 6]), Vec::from([7, 8, 9]), ]); // 使用iter_mut()获取可变引用,原地反转每个子向量 rows.iter_mut().for_each(|arr| arr.reverse()); println!("{:?}", rows); // 输出: [[3, 2, 1], [6, 5, 4], [9, 8, 7]] }
这里iter_mut()生成Iterator<Item=&mut Vec<u32>>,满足reverse()对可变引用的要求,for_each用来执行原地修改操作,无需收集结果。
方案2:生成新的反转向量(保留原数据)
如果需要保留原rows不变,生成一个新的反转后的向量:
方法A:通过rev()迭代器收集
fn main() { let rows: Vec<Vec<u32>> = Vec::from([ Vec::from([1, 2, 3]), Vec::from([4, 5, 6]), Vec::from([7, 8, 9]), ]); let res: Vec<Vec<u32>> = rows.iter() // 对每个子向量的迭代器反转,克隆元素后收集成新Vec .map(|arr| arr.iter().rev().cloned().collect()) .collect(); println!("原向量: {:?}", rows); // 输出: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] println!("反转后的新向量: {:?}", res); // 输出: [[3, 2, 1], [6, 5, 4], [9, 8, 7]] }
arr.iter().rev()生成反转的元素引用迭代器,cloned()将引用转为实际的u32值,最后collect()成新的Vec<u32>。
方法B:克隆子向量后反转
fn main() { let rows: Vec<Vec<u32>> = Vec::from([ Vec::from([1, 2, 3]), Vec::from([4, 5, 6]), Vec::from([7, 8, 9]), ]); let res: Vec<Vec<u32>> = rows.iter() .map(|arr| { let mut cloned_arr = arr.clone(); cloned_arr.reverse(); cloned_arr }) .collect(); println!("原向量: {:?}", rows); println!("反转后的新向量: {:?}", res); }
先克隆原有的子向量得到可变的Vec<u32>,再调用reverse()原地反转,最后返回修改后的克隆向量。
内容的提问来源于stack exchange,提问作者Eshaan Aggarwal
相关产品推荐
相关产品推荐

