Rust:迭代二维向量列的惯用方法

nun*_*nam 4 iterator functional-programming vector multidimensional-array rust

我是 Rust 新手,想知道迭代 2d 向量上的列的惯用方法是什么。我知道如何对行执行此操作,例如查找每行的最大值,如下所示

let my_2d_vector: Vec<Vec<u64>> = vec![];
let max_in_each_rows = my_2d_vector.iter()
   .map(|&row| row.iter().max())
   .collect::<Vec<64>>();
Run Code Online (Sandbox Code Playgroud)

如何在不使用循环的情况下找到每列的最大值?

isa*_*tfa 6

从功能上解决这个问题的一种方法是这样的:

let my_2d_vector: Vec<Vec<u64>> = vec![vec![1, 4, 3], vec![3, 3, 3]];
let max_in_each_col =
    my_2d_vector
        .iter()
        .skip(1)
        .fold(my_2d_vector[0].clone(), |mut maxes, row| {
            maxes
                .iter_mut()
                .zip(row.iter())
                .for_each(|(m, col)| *m = std::cmp::max(*m, *col));
            maxes
        });

println!("{:?}", max_in_each_col); // [3, 4, 3]
Run Code Online (Sandbox Code Playgroud)

然而,认为循环不是惯用的 Rust 是一种误解。你可能会发现上面的内容不太可读,rustfmt 将其格式化为 11 行。而使用循环,虽然逻辑完全相同,但你会得到这个

let my_2d_vector: Vec<Vec<u64>> = vec![vec![1, 4, 3], vec![3, 3, 3]];
let mut max_in_each_col = my_2d_vector[0].clone();
for row in &my_2d_vector[1..] {
    for (m, col) in max_in_each_col.iter_mut().zip(row.iter()) {
        *m = std::cmp::max(*m, *col);
    }
}

println!("{:?}", max_in_each_col); // [3, 4, 3]
Run Code Online (Sandbox Code Playgroud)

仅 6 行,非常易读。