Vector 在Rust中重复向量中元素的最佳方法是什么?

Vector 在Rust中重复向量中元素的最佳方法是什么?,vector,rust,Vector,Rust,我是这样发现的,但对于这样一个普通的行为来说,它似乎太冗长了: fn double_vec(vec: Vec<i32>) -> Vec<i32> { let mut vec1 = vec.clone(); let vec2 = vec.clone(); vec1.extend(vec2); vec1 } fn-double\u-vec(vec:vec)->vec{ 让mut vec1=vec.clone(); 设vec2=vec

我是这样发现的,但对于这样一个普通的行为来说,它似乎太冗长了:

fn double_vec(vec: Vec<i32>) -> Vec<i32> {
    let mut vec1 = vec.clone();
    let vec2 = vec.clone();

    vec1.extend(vec2);

    vec1
}
fn-double\u-vec(vec:vec)->vec{
让mut vec1=vec.clone();
设vec2=vec.clone();
vec1.扩展(vec2);
vec1
}
我知道,在JavaScript中,它可能只是
arr2=[…arr1,…arr1]

“加倍向量”并不是经常做的事情,因此没有捷径可走。此外,
Vec
中的内容也很重要,因为这会改变可以对其执行的操作。在此特定示例中,以下代码起作用:

let x = vec![1, 2, 3];

let y: Vec<_> = x.iter().cycle().take(x.len() * 2).collect();

println!("{:?}", y); //[1, 2, 3, 1, 2, 3]

基于卫斯理的答案,你也可以用胶水把两个易拉罐粘在一起,一个接一个。在下面的示例中,我两次使用相同的
Vec
iter()
方法:

let x = vec![1, 2, 3];

let y: Vec<_> = x.iter().chain(x.iter()).collect();

println!("{:?}", y); //[1, 2, 3, 1, 2, 3]
让x=vec![1, 2, 3];
设y:Vec=x.iter().chain(x.iter()).collect();
普林顿!(“{:?}”,y)//[1, 2, 3, 1, 2, 3]

您可以使用concat方法进行此操作,它很简单:

fn double_vec(v: Vec<i32>) -> Vec<i32> {
    [&v[..], &v[..]].concat()
}
fn-double\u-vec(v:vec)->vec{
[&v[…],&v[…]].concat()
}

不幸的是,我们必须明确地进行向量切片(这里
&v[…]
);但除此之外,这种方法是好的,因为它直接将结果分配到所需的大小,然后进行复制。

迭代器方法的效率可能比向量扩展的直接
memcpy要低得多

你自己的代码做了
克隆
太多;您只需重新使用按值输入:

fn double_vec(mut vec: Vec<i32>) -> Vec<i32> {
    let clone = vec.clone();
    vec.extend(clone);
    vec
}

可能值得一提的是
y
的类型是
Vec
而不是
Vec
。这是一个很好的解决方案,因为它允许您处理内容无法克隆的向量。即使在这个解决方案中,也只需要其中一个
.clone()
s。
fn double_vec(mut vec: Vec<i32>) -> Vec<i32> {
    let clone = vec.clone();
    vec.extend(clone);
    vec
}
fn double_slice(slice: &[i32]) -> Vec<i32> {
    [slice, slice].concat()
}