在Rust中,如何在向量的向量中合并两个子向量?

时间:2019-01-15 10:38:35

标签: rust

在Rust中,我有Vec的{​​{1}}。我想将一个子Vec的内容与另一个子内容合并。

这是我的代码:

Vec

问题在于,我不能两次借用let mut a = vec![vec![1, 2, 3], vec![3, 4, 5, 6], vec![8, 9]]; a[0].append(&mut a[1]); assert_eq!(&a, &[vec![1, 2, 3, 3, 4, 5, 6], vec![], vec![8, 9]]) 都是可变的。 解决问题的最有效,最惯用的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用fold在一个循环中实现它

fn main() {
    let mut a = vec![vec![1, 2, 3], vec![3, 4, 5, 6], vec![8, 9]];

    a.iter_mut()
        .fold(&mut Vec::new(), |previous_vec, current_vec| {
            if previous_vec.len() > 0
                && current_vec.len() > 0
                && previous_vec.last() == current_vec.first()
            {
                previous_vec.append(current_vec);
                return previous_vec;
            }
            current_vec
        });

    assert_eq!(a, vec![vec![1, 2, 3, 3, 4, 5, 6], vec![], vec![8, 9]]);
}

您可以在Playground

中对其进行测试

答案 1 :(得分:0)

我认为将extenditerdrain迭代器一起使用的最佳解决方案

    let mut v1 = vec![1,2,3];
    let mut v2 = vec![3,4,5];

    if v1[v1.len()-1] == v2[0] {
        v1.extend(v2[1..].iter()); // clones elemts
        println!("{:?}", v1);
        v1.extend(v2.drain(1..)); // drained from second vector this time
        println!("{:?}", v2);
    }

Live example

您将切片传递到extend,如果要移动切片,请使用drainiter进行克隆。未耗尽的元素将留在第二个向量中。

更新:对问题进行更改后,您可能应该在检查后将内部vec移至某个临时vec,然后将其与extend合并