You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何反转向量的子向量?解决类型注解问题

解决Rust中Vec<Vec<u32>>子向量反转的类型问题

问题分析

你的代码存在两个核心问题:

  1. rows.iter()返回的是不可变引用迭代器(Iterator<Item=&Vec<u32>>),而reverse()方法需要可变引用(&mut Vec<u32>)才能原地修改向量。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:50:26