要使用其他向量的内容创建一个新向量,我目前正在这样做:
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)
有没有更直接/优雅的方法来做到这一点?
有一种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)