【问题标题】:Rust: Map two Vecs into a third Vec of composite structsRust:将两个 Vec 映射到复合结构的第三个 Vec
【发布时间】:2020-02-16 15:28:28
【问题描述】:

我有三个结构:

struct A;

struct B;

struct C {
    a: Option<A>,
    b: Option<B>
}

给定输入 Vec&lt;A&gt;Vec&lt;B&gt; 以及一些谓词函数,我想创建一个输出 Vec&lt;C&gt;,它是输入元素的组合,如下所示:

let aVec: Vec<A> = vec![];
let bVec: Vec<B> = vec![];
let mut cVec: Vec<C> = vec![];
for a in aVec {
    if let Some(b) = bVec.into_iter().find(predicate) {
        cVec.push(C{a: Some(a), b: Some(b)});
    }
}

有没有办法做到这一点而不需要B 是可复制的?操作后不需要两个输入向量。另外,如果没有循环,这可能吗?

【问题讨论】:

    标签: rust


    【解决方案1】:

    你可以:

    • 找到满足predicate的元素的索引。 (我会使用Iterator::position。)
    • removeswap_remove上一步得到的位置的元素。
    • push 之前删除的元素到结果中。

    在代码中:

    use itertools; // 0.8.2
    use itertools::Itertools;
    
    struct A {}
    
    struct B {
        n: usize,
    }
    
    struct C {
        a: Option<A>,
        b: Option<B>
    }
    
    fn  main() {
        let aVec: Vec<A> = vec![];
        let mut bVec: Vec<B> = vec![];
        let mut cVec: Vec<C> = vec![];
        for a in aVec {
            if let Some(idx) = bVec.iter()
                                   .position(|b| b.n==42)
            {
                let b = bVec.remove(idx); // or swap_remove if ordering does not need to be preserved
                cVec.push(C{a: Some(a), b: Some(b)});
            }
    
        }    
    }
    

    【讨论】:

    • 这很好用。我什至可以通过不使用额外的板条箱来简化这一点:if let Some(idx) = bVec.iter().position(|b| b.n==42) {
    • @jeevcat 很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2012-07-17
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多