【问题标题】:How can I concatenate two slices or two vectors and still have access to the original values?如何连接两个切片或两个向量并且仍然可以访问原始值?
【发布时间】:2019-06-06 03:21:41
【问题描述】:

我有两个切片或向量,我想添加它们,如 Golang 中所示:

a := []byte{1, 2, 3}
b := []byte{4, 5, 6}
ab := append(a, b...)
ba := append(b, a...)

如何在 Rust 中做到这一点?我发现了一些其他的问题,例如:

但是,他们所有的最佳答案都是a += b,而不是ab = a + b

let mut a = vec![1, 2, 3];
let mut b = vec![4, 5, 6];

a.append(&mut b);

assert_eq!(a, [1, 2, 3, 4, 5, 6]);
assert_eq!(b, []);

或者在 Rust 中是否有类似 Vec::append(a, b) 的函数?

【问题讨论】:

  • 你能解释一下你想要的输出是什么吗?您提供的示例代码有什么问题? ab到底想看什么?你想要一个新的向量而不修改其他向量吗?
  • @hellow 我想要 var ab 和 var ba,我该怎么做??
  • 你能不能回答我的问题,不要问新问题。
  • 我想要 ab = a + b,而不是 a = a + b
  • 请回答我的所有个问题,因为如何解决这个问题很重要。

标签: vector rust append slice


【解决方案1】:

你可以chain你的迭代器:

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

    // Don't consume the original vectors and clone the items:
    let ab: Vec<_> = a.iter().chain(&b).cloned().collect();

    // Consume the original vectors. The items do not need to be cloneable:
    let ba: Vec<_> = b.into_iter().chain(a).collect();

    assert_eq!(ab, [1, 2, 3, 4, 5, 6]);
    assert_eq!(ba, [4, 5, 6, 1, 2, 3]);
}

请注意,迭代器知道它产生的项目数,因此collect 可以直接分配正确的内存量:

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

    let ba = b.into_iter().chain(a);
    assert_eq!(ba.size_hint(), (6, Some(6)));

    let ba: Vec<_> = ba.collect();
    assert_eq!(ba, [4, 5, 6, 1, 2, 3]);
}

【讨论】:

    【解决方案2】:

    没有Vec的构造函数直接追加两个切片。

    功能不是基本的,您可以自己实现:

    let ab = {
        let mut r = a.clone();
        r.extend_from_slice(&b);
        r
    };
    

    如果您发现自己经常执行此操作,您可能更愿意编写一个函数来执行此操作:

    fn cat<T: Clone>(a: &[T], b: &[T]) -> Vec<T> {
        let mut v = Vec::with_capacity(a.len() + b.len());
        v.extend_from_slice(a);
        v.extend_from_slice(b);
        v
    }
    

    然后你就可以做到:let ab = cat(&amp;a, &amp;b);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2013-04-21
      • 1970-01-01
      • 2016-06-17
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多