如何高效将结构体向量字段收集到独立数组?能否仅迭代一次?
单次遍历拆分结构体字段到独立数组的Rust实现
当然有办法只遍历一次向量就完成字段拆分,这里提供两种实用的实现方式:
方法一:函数式风格的fold实现
利用Iterator::fold携带一个包含两个空Vec的元组作为累加器,单次迭代中同时填充两个目标数组:
struct Vx { pub a: f32, pub b: f32, } fn main() { let mut varr = Vec::new(); varr.push(Vx { a: 0., b: 0. }); varr.push(Vx { a: 1., b: 1. }); varr.push(Vx { a: 2., b: 2. }); let (a, b): (Vec<f32>, Vec<f32>) = varr.iter() .fold((Vec::new(), Vec::new()), |(mut acc_a, mut acc_b), v| { acc_a.push(v.a); acc_b.push(v.b); (acc_a, acc_b) }); println!("a: {:?}", a); println!("b: {:?}", b); }
方法二:预分配容量的for循环(更直观高效)
如果追求可读性和性能优化,可以提前根据原向量长度为目标Vec预分配容量,避免动态扩容的额外开销,再通过普通for循环单次遍历填充:
struct Vx { pub a: f32, pub b: f32, } fn main() { let mut varr = Vec::new(); varr.push(Vx { a: 0., b: 0. }); varr.push(Vx { a: 1., b: 1. }); varr.push(Vx { a: 2., b: 2. }); // 预分配容量,匹配原向量长度 let (mut a, mut b) = (Vec::with_capacity(varr.len()), Vec::with_capacity(varr.len())); for v in varr.iter() { a.push(v.a); b.push(v.b); } println!("a: {:?}", a); println!("b: {:?}", b); }
两种方法都只对原向量做一次遍历,后者的预分配操作在处理大向量时能显著提升性能,前者则更符合函数式编程风格。
内容的提问来源于stack exchange,提问作者Dávid Tóth
相关产品推荐
相关产品推荐

