rust 如何有效地将结构向量中的字段收集到单独的数组中

kqlmhetl  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(111)

我设法使它工作(见下面的例子),但这需要多次迭代的数组。
有没有一种方法可以只对矢量进行一次迭代?

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: Vec<f32> = varr.iter().map(|v| v.a).collect();
    let b: Vec<f32> = varr.iter().map(|v| v.b).collect();

    println!("a: {:?}", a);
    println!("b: {:?}", b);
}

字符串

lztngnrs

lztngnrs1#

map + unzip只适用于两个字段,但对于任意数量的字段,您始终可以使用更通用的fold并将其解压缩为任何类型的结构:

struct Vx {
    pub a: f32,
    pub b: f32,
    pub c: f32,
}

fn main() {
    let mut varr = Vec::new();
    varr.push(Vx {
        a: 0.,
        b: 0.,
        c: 1.,
    });
    varr.push(Vx {
        a: 1.,
        b: 1.,
        c: 2.,
    });
    varr.push(Vx {
        a: 2.,
        b: 2.,
        c: 3.,
    });

    let len = varr.len();
    let (a, b, c) = varr.iter().fold(
        (
            Vec::with_capacity(len),
            Vec::with_capacity(len),
            Vec::with_capacity(len),
        ),
        |(mut a, mut b, mut c), v| {
            a.push(v.a);
            b.push(v.b);
            c.push(v.c);
            (a, b, c)
        },
    );

    println!("a: {:?}", a); // a: [0.0, 1.0, 2.0]
    println!("b: {:?}", b); // b: [0.0, 1.0, 2.0]
    println!("c: {:?}", c); // c: [1.0, 2.0, 3.0]
}

字符串

5f0d552i

5f0d552i2#

可以使用mapunzip

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().map(|v| (v.a, v.b)).unzip();

    println!("a: {:?}", a);
    println!("b: {:?}", b);
}

字符串

lb3vh1jj

lb3vh1jj3#

这可以用迭代器来完成,如其他答案所示。然而,在这种情况下,一个简单的过程解决方案可能更合适:

struct Vx {
    pub a: f32,
    pub b: f32,
    pub c: f32,
}

fn main() {
    let mut varr = Vec::new();
    varr.push(Vx {
        a: 0.,
        b: 0.,
        c: 1.,
    });
    varr.push(Vx {
        a: 1.,
        b: 1.,
        c: 2.,
    });
    varr.push(Vx {
        a: 2.,
        b: 2.,
        c: 3.,
    });

    let len = varr.len();
    let mut a = Vec::with_capacity (len);
    let mut b = Vec::with_capacity (len);
    let mut c = Vec::with_capacity (len);
    for v in &varr {
        a.push (v.a);
        b.push (v.b);
        c.push (v.c);
    }
    // Optional, make immutable:
    let (a, b, c) = (a, b, c);

    println!("a: {:?}", a); // a: [0.0, 1.0, 2.0]
    println!("b: {:?}", b); // b: [0.0, 1.0, 2.0]
    println!("c: {:?}", c); // c: [1.0, 2.0, 3.0]
}

字符串
Playground

相关问题