Vector 如何将一个向量的切片k次复制到另一个向量中?

Vector 如何将一个向量的切片k次复制到另一个向量中?,vector,rust,Vector,Rust,我有一个向量a,我需要复制这个向量的一个片段,比如a[n..n+3],k次 例如: a = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9] n = 2 k = 3 然后我想生成: b = vec![2, 3, 4, 2, 3, 4, 2, 3, 4] 在之前的一些帮助下,我最终得出以下结论: a[n..n+3].iter().cloned().cycle().take(3 * k).collect() 这是习惯用语吗?有更可取的方法吗?好的,在阅读本文之后 并运行下面

我有一个向量
a
,我需要复制这个向量的一个片段,比如
a[n..n+3]
k

例如:

a = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
n = 2
k = 3
然后我想生成:

b = vec![2, 3, 4, 2, 3, 4, 2, 3, 4]
在之前的一些帮助下,我最终得出以下结论:

a[n..n+3].iter().cloned().cycle().take(3 * k).collect()

这是习惯用语吗?有更可取的方法吗?

好的,在阅读本文之后 并运行下面的基准测试

#![feature(test)] extern crate test; use test::Bencher; #[bench] fn bench_target_func(b: &mut Bencher) { let a = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; let n = 2; let k = 3; b.iter( || { let b: Vec = a[n..n+3].iter().cloned().cycle().take(3 * k).collect(); }); } #[bench] fn bench_target_imper(b: &mut Bencher) { let a = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; let n = 2; let k = 3; b.iter( || { let mut b: Vec = Vec::with_capacity(k * 3); let mut it = a[n..n+3].iter().cloned().cycle(); for _ in 0..k*3 { b.push(it.next().unwrap()); } }); } #[bench] fn bench_target_imper2(b: &mut Bencher) { let a = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; let n = 2; let k = 3; b.iter(|| { let mut b = Vec::with_capacity(3 * k); for _ in 0..k { b.extend_from_slice(&a[n..n + 3]); } }); } #[bench] fn bench_target_func2(b: &mut Bencher) { let a = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; let n = 2; let k = 3; b.iter(|| { let b : Vec = (0..k).flat_map(|_| a[n..n+3].iter().cloned()).collect(); }); } fn main() { println!("Hello, world!"); } #![特征(测试)] 体外板条箱试验; 使用试验台; #[法官席] fn工作台\目标\功能(b:&多台工作台){ 设a=vec![0,1,2,3,4,5,6,7,8,9]; 设n=2; 设k=3; b、 国际热核实验堆{ 设b:Vec=a[n..n+3].iter().cloned().cycle().take(3*k.collect(); }); } #[法官席] fn台架\目标\帝国(b:&多台台架){ 设a=vec![0,1,2,3,4,5,6,7,8,9]; 设n=2; 设k=3; b、 国际热核实验堆{ 设mut b:Vec=Vec::具有_容量(k*3); 设mut it=a[n..n+3].iter().cloned().cycle(); 对于0..k*3中的uu{ b、 推(it.next().unwrap()); } }); } #[法官席] fn工作台目标2(b:&多台工作台){ 设a=vec![0,1,2,3,4,5,6,7,8,9]; 设n=2; 设k=3; b、 国际热核实验堆{ 设mut b=Vec::具有_容量(3*k); 对于0..k中的uu{ b、 从_切片(&a[n..n+3])扩展_; } }); } #[法官席] fn工作台\目标\功能2(b:&多台工作台){ 设a=vec![0,1,2,3,4,5,6,7,8,9]; 设n=2; 设k=3; b、 国际热核实验堆{ 设b:Vec=(0..k).flat_-map(| | a[n..n+3].iter().cloned()).collect(); }); } fn main(){ println!(“你好,世界!”); } 我得到了以下结果:

test bench_target_func ... bench: 31 ns/iter (+/- 0) test bench_target_func2 ... bench: 97 ns/iter (+/- 1) test bench_target_imper ... bench: 37 ns/iter (+/- 0) test bench_target_imper2 ... bench: 29 ns/iter (+/- 0) 测试台\目标\功能。。。实验台:31纳秒/国际热核实验堆(+/-0) 测试台\目标\功能2。。。实验台:97纳秒/国际热核实验堆(+/-1) 试验台\目标\危害。。。实验台:37纳秒/国际热核实验堆(+/-0) 测试台目标2。。。实验台:29纳秒/国际热核实验堆(+/-0)
平面图似乎要慢得多。

对我来说,你的例子似乎足够地道,但我会这样做:

let a = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let n = 2;
let k = 3;

let b : Vec<_> = (0..k).flat_map(|_| a[n..n+3].iter().cloned()).collect();
println!("{:?}", b);

那么,这会是惯用的生锈吗?谢谢你的工作。功能版本看起来既可读性强,又速度快。它宁愿接受少量的ns影响,并拥有干净的代码。
bench\u target\u imper
的工作量减少了3倍<代码>适用于0..k中的应该是
适用于0..k*3中的
谢谢。我已经更正了代码和结果
let a = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let n = 2;
let k = 3;

let mut b = Vec::with_capacity(3 * k);
for _ in 0..k {
    b.extend_from_slice(&a[n..n+3]);
}
println!("{:?}", b);