rust 如何在不消耗迭代器的情况下合并两个引用向量?

bjp0bcyl  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(160)

我想合并两个引用向量,并将它们转换为一个值的向量,而不消耗迭代器。

情况:

通过对特定组合进行迭代来生成向量。(一个向量中的2个元素,另一个向量中的2个元素)

  • 编码:
use core::iter::Iterator;
use itertools::Itertools;

fn main() {
    let vec_a: Vec<u8> = vec![1, 2, 3];
    let vec_b: Vec<u8> = vec![4, 5, 6];

    // a: Vec<&u8>
    for a in vec_a.iter().combinations(2) {
        // b: Vec<&u8>
        for b in vec_b.iter().combinations(2) {
            // c: Vec<u8> <- a + b
            let c: Vec<u8> = a.clone().into_iter().chain(b).cloned().collect();
            println!("a: {:?}, b: {:?}, c: {:?}", a, b, c);
        }
    }
}
  • 预期输出:
a: [1, 2], b: [4, 5], c: [1, 2, 4, 5]
a: [1, 2], b: [4, 6], c: [1, 2, 4, 6]
a: [1, 2], b: [5, 6], c: [1, 2, 5, 6]
a: [1, 3], b: [4, 5], c: [1, 3, 4, 5]
a: [1, 3], b: [4, 6], c: [1, 3, 4, 6]
a: [1, 3], b: [5, 6], c: [1, 3, 5, 6]
a: [2, 3], b: [4, 5], c: [2, 3, 4, 5]
a: [2, 3], b: [4, 6], c: [2, 3, 4, 6]
a: [2, 3], b: [5, 6], c: [2, 3, 5, 6]

附言
在发布问题之前,我阅读了下面的链接。然而,这个问题的答案消耗了Vec和它的迭代器,所以它在这种情况下不起作用。
Best way to concatenate vectors in Rust

rbpvctlc

rbpvctlc1#

感谢@ChayimFriedman。
有一些方法可以做到这一点。

*无消耗

// a: Vec<&u8>
// b: Vec<&u8>

let c: Vec<u8> = a.iter().chain(&b).copied().copied().collect();
println!("a: {:?}", a);
println!("b: {:?}", b);

*含消耗量

// a: Vec<&u8>
// b: Vec<&u8>

let c: Vec<u8> = a.into_iter().chain(b).copied().collect();
// println!("a: {:?}", a); -> compile error
// println!("b: {:?}", b); -> compile error

相关问题