我有两个迭代器,最终将它们合并到同一个Vec
中,但是在合并之前,我需要对最终结果进行过滤。例如:
let a = vec![1, 2, 3, 4].into_iter().map(|x| x * 2);
let b = vec![0, 3, 5, 6, 7].into_iter().map(|x| x * 3);
let c = a + b;
assert_eq!(
c.filter(|&x| x > 5).collect::<Vec<u8>>(),
vec![6, 8, 9, 15, 18, 21]
);
我可以做这样的事情:
let mut a = vec![1, 2, 3, 4]
.into_iter()
.map(|x| x * 2)
.collect::<Vec<u8>>();
let b = vec![0, 3, 5, 6, 7]
.into_iter()
.map(|x| x * 3)
.collect::<Vec<u8>>();
a.extend(b);
assert_eq!(
a.into_iter().filter(|&x| x > 5).collect::<Vec<u8>>(),
vec![6, 8, 9, 15, 18, 21]
);
但是在我的情况下,额外的分配会降低性能(是的,我检查过!)
答案 0 :(得分:8)
您正在寻找Iterator::chain
<span style="font-family='Helvetica'; font-size 12px;">et cetera</span>
答案 1 :(得分:1)
或者,您可以使用extend()
:
let a = (0..500000).map(|x| x * 2);
let b = (0..500000).map(|x| x * 3);
let mut c = Vec::with_capacity(a.size_hint().1.unwrap() + b.size_hint().1.unwrap());
c.extend(a);
c.extend(b);
这要求您显式使用with_capacity()
和chain()
会为您完成的collect()
。在已经构建a
的情况下,extend()
将比构建临时矢量更合适。
在这种情况下(benchmark),我没有发现chain()
和extend
之间的基准差异
这不会进行过滤。 Sebastian Redl
正确!解决此错误表明,由于某种原因,LLVM现在不再优化chain()
。带有extend
的版本:
let a = (0..500000).map(|x| x * 2);
let b = (0..500000).map(|x| x * 3);
let mut c = Vec::with_capacity(a.size_hint().1.unwrap() + b.size_hint().1.unwrap());
c.extend(a.filter(|&x| x > 5));
c.extend(b.filter(|&x| x > 5));
速度是使用chain
的版本的两倍(这是我最初期望的速度):
let a = (0..500000).map(|x| x * 2);
let b = (0..500000).map(|x| x * 3);
let _c: Vec<_> = a.chain(b).filter(|&x| x > 5).collect();