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)
如何在不使用循环的情况下找到每列的最大值?
从功能上解决这个问题的一种方法是这样的:
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 行,非常易读。