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

如何高效将结构体向量字段收集到独立数组?能否仅迭代一次?

单次遍历拆分结构体字段到独立数组的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:07:07