将许多向量连接成一个新向量的最佳方法是什么?

ide*_*n42 5 vector rust

要使用其他向量的内容创建一个新向量,我目前正在这样做:

fn func(a: &Vec<i32>, b: &Vec<i32>, c: &Vec<i32>) {
    let abc = Vec<i32> = {
        let mut tmp = Vec::with_capacity(a.len(), b.len(), c.len());
        tmp.extend(a);
        tmp.extend(b);
        tmp.extend(c);
        tmp
    };

    // ...
}
Run Code Online (Sandbox Code Playgroud)

有没有更直接/优雅的方法来做到这一点?

til*_*ner 7

有一种concat方法可以用于此,但是值需要是切片,或者可以借用切片,而不是&Vec<_>问题中给出的。

一个例子,类似于问题:

fn func(a: &Vec<i32>, b: &Vec<i32>, c: &Vec<i32>) {
    let abc = Vec<i32> = [a.as_slice(), b.as_slice(), c.as_slice()].concat();

    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,正如@mindTree 所指出的,使用&[i32]类型参数更符合习惯,并且不需要转换。例如:

fn func(a: &[i32], b: &[i32], c: &[i32]) {
    let abc = Vec<i32> = [a, b, c].concat();

    // ...
}
Run Code Online (Sandbox Code Playgroud)

SliceConcatExt::concat是函数的更通用版本,可以将多个切片连接到 Vec。它将对每个切片的大小求和以预先分配正确容量的 Vec,然后重复扩展。

fn concat(&self) -> Vec<T> {
    let size = self.iter().fold(0, |acc, v| acc + v.borrow().len());
    let mut result = Vec::with_capacity(size);
    for v in self {
        result.extend_from_slice(v.borrow())
    }
    result
}
Run Code Online (Sandbox Code Playgroud)