Vector 在Rust中连接向量的最佳方法

Vector 在Rust中连接向量的最佳方法,vector,rust,concatenation,Vector,Rust,Concatenation,甚至可以在Rust中连接向量吗?如果是的话,有没有优雅的方式?我有这样的想法: let mut a = vec![1, 2, 3]; let b = vec![4, 5, 6]; for val in &b { a.push(val); } 有人知道更好的方法吗?结构std::vec::vec有方法: 或者,您可以使用将可转换为迭代器(如Vec)的内容的所有元素附加到给定向量: let mut a = vec![1, 2, 3]; let b = vec![4, 5, 6]

甚至可以在Rust中连接向量吗?如果是的话,有没有优雅的方式?我有这样的想法:

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

for val in &b {
    a.push(val);
}

有人知道更好的方法吗?

结构
std::vec::vec
有方法:


或者,您可以使用将可转换为迭代器(如
Vec
)的内容的所有元素附加到给定向量:

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

a.extend(b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
// b is moved and can't be used anymore
请注意,向量
b
被移动而不是清空。如果向量包含实现的元素,则可以将一个向量的不可变引用传递给
extend()
,以避免移动。在这种情况下,向量
b
不变:

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

a.extend(&b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
assert_eq!(b, [4, 5, 6]);
我一行不行

可以使用以下方法在一行中完成:

让c:Vec=a.进入iter().chain(b.进入iter()).collect();//消耗
设c:Vec=a.iter().chain(b.iter()).collect();//参考
设c:Vec=a.iter().cloned().chain(b.iter().cloned()).collect();//克隆的
设c:Vec=a.iter().copied().chain(b.iter().copied()).collect();//抄袭

有无限的方法。

关于性能,
append
extend
大致相同。如果您不需要立即得到结果,那么使用链式迭代器是最快的;如果您需要收集(),它是最慢的:

#![特征(测试)]
体外板条箱试验;
使用试验台;
#[法官席]
fn台架(b:和多台架){
b、 国际热核实验堆{
设mut x=vec![1i32;100000];
让mut y=vec![2i32;100000];
});
}
#[法官席]
fn工作台连接(b:&多台工作台){
b、 国际热核实验堆{
设mut x=vec![1i32;100000];
让mut y=vec![2i32;100000];
x、 追加(&M)
});
}
#[法官席]
fn工作台连接延伸(b:和多台工作台){
b、 国际热核实验堆{
设mut x=vec![1i32;100000];
让mut y=vec![2i32;100000];
x、 延伸(y)
});
}
#[法官席]
fn工作台(b:和多台工作台){
b、 国际热核实验堆{
设mut x=vec![1i32;100000];
让mut y=vec![2i32;100000];
[x,y].concat()
});
}
#[法官席]
fn工作台连接链(b:和多工作台){
b、 国际热核实验堆{
设mut x=vec![1i32;100000];
让mut y=vec![2i32;100000];
x、 插入iter().链(y.插入iter())
});
}
#[法官席]
fn工作台、混凝土工作台、链条工作台(b:&多台工作台){
b、 国际热核实验堆{
设mut x=vec![1i32;100000];
让mut y=vec![2i32;100000];
x、 插入iter()。链(y.插入iter())。收集::()
});
}

相关的,可能重复的:你问题中的代码没有编译。你能更具体一点吗?你想通过使用另外两个来生成一个向量,还是仅仅在连接上使用一个迭代器?a.extend(b)有什么问题?@user4815162342 a.extend(b)不方便的地方是它不返回b,因此,在函数方法(如map)中需要稍微复杂一些的表达式。消费、克隆和复制之间有什么区别?我以为只有参考资料(是的,是吗?)和clones@DamianDziaduch哇,那个女人,你让我解释生锈;)如果您有经验,您可以理解以下几点:基本上使用移动数据,因此
a
b
不再可用,结果可以自由执行它想要的操作。引用只是借用了这两个向量,所以你需要让它们活下去,只要结果想活下去。克隆和复制非常接近,第一个可能很昂贵,第二个应该很便宜。它们只是将这两个向量都用作源,而不需要后者,因此结果可以自由地生存,只要它愿意,
a
b
。希望一切都清楚。我看到这条链子还在断。。。那太可悲了。你的
bench\u concat\u iter\u chain
什么都不做,迭代器是懒惰的
let mut a = vec![1, 2, 3];
let b = vec![4, 5, 6];

a.extend(b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
// b is moved and can't be used anymore
let mut a = vec![1, 2, 3];
let b = vec![4, 5, 6];

a.extend(&b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
assert_eq!(b, [4, 5, 6]);
running 6 tests
test bench_concat___init__           ... bench:      27,261 ns/iter (+/- 3,129)
test bench_concat_append             ... bench:      52,820 ns/iter (+/- 9,243)
test bench_concat_concat             ... bench:      53,566 ns/iter (+/- 5,748)
test bench_concat_extend             ... bench:      53,920 ns/iter (+/- 7,329)
test bench_concat_iter_chain         ... bench:      26,901 ns/iter (+/- 1,306)
test bench_concat_iter_chain_collect ... bench:     190,334 ns/iter (+/- 16,107)