【问题标题】:In Rust how to merge two sub vectors within a vector of vectors? [duplicate]在 Rust 中,如何在一个向量向量中合并两个子向量? [复制]
【发布时间】:2019-01-15 10:38:34
【问题描述】:

在 Rust 中,我有一个 VecVec。我想将一个子 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]])

问题是我不能两次借用 a 为可变的。 解决它最有效和最惯用的方法是什么?

【问题讨论】:

  • 或者你可以交换内存:let tmp = std::mem::replace(&mut a[1], Vec::new()):play.rust-lang.org/…。无论哪种方式,这都是重复的。
  • @Boiethios,我认为这不是 OP 所需要的。需要检查包含向量是否需要尾随,因此需要与最后一个和第一个元素匹配的元素。我不确定编辑和游乐场链接是否适合 OP 的需要,因为向量被替换为硬编码的 mem::replace index
  • @AkinerAlkan 好吧,我不是在这里猜测。如果 OP 想要这样做,让他更新问题。
  • @Boiethios,你是对的,所以我保留我的答案,让我们说如果 OP 真的有开始时提出的需求,那么他可以使用我的答案,如果不是,您的游乐场链接将是更简单合理的解决方案
  • @Boiethios @AkinerAlkan 抱歉,在您撰写回复时,我将问题更改为更简单的问题。对于简化和完整的问题,std::mem::replace 函数解决了我的问题。

标签: rust


【解决方案1】:

您可以使用 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进行测试

【讨论】:

  • 方式太复杂了。
  • 确实回答了最初提出的问题……
  • @Jmb 哦,我的错,我没有看到问题的第一个版本......
【解决方案2】:

我认为将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

您将 slice 传递给 extend,如果您希望它们被移动,请使用 drainiter 进行克隆。未耗尽的元素将留在第二个向量中。

更新:通过您对问题所做的更改,您可能应该在检查后将内部 vec 移动到某个临时 vec,然后将其与 extend 合并

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2019-08-13
    • 2013-01-22
    • 2020-04-06
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多