如何移除转置Vec<Vec<T>>函数中无用的(0..)迭代器?
重构Vec<Vec>转置函数,移除无用迭代器
你写的这个转置函数里,(0..)作为无限迭代器仅用来触发循环,完全没用到迭代变量,确实可以重构掉。
用std::iter::from_fn就能完美替代原逻辑,它允许我们自定义生成迭代元素的闭包,直到闭包返回None时终止迭代。重构后的代码如下:
fn transpose<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>> { let mut xs = v.into_iter().map(|x| x.into_iter()).collect::<Vec<_>>(); std::iter::from_fn(|| { let row: Vec<_> = xs.iter_mut().filter_map(|x| x.next()).collect(); if !row.is_empty() { Some(row) } else { None } }).collect() }
这个逻辑和原代码完全一致:每次遍历所有子迭代器,收集它们的下一个元素组成一行;当某一次收集到的行是空的(说明所有子迭代器都耗尽了),就终止迭代,最终把所有行收集成转置后的二维向量。
这样就彻底去掉了那个没用的(0..)无限迭代器,代码逻辑也更直观。
内容的提问来源于stack exchange,提问作者user22608671
相关产品推荐
相关产品推荐

