Rust 有没有办法将两个迭代器合并到同一个Vec中?

Rust 有没有办法将两个迭代器合并到同一个Vec中?,rust,iterator,Rust,Iterator,我有两个迭代器,它们最终将合并到同一个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
,但我需要在合并之前对最终结果执行筛选。例如:

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]
);
让a=vec![1,2,3,4].into_iter().map(|x | x*2);
让b=vec![0,3,5,6,7].into|iter().map(|x | x*3);
设c=a+b;
断言!(
c、 过滤器(|&x | x>5)。收集::(),
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]
);
让mut a=vec![1, 2, 3, 4]
.into_iter()
.map(|x | x*2)
收集::();
让b=vec![0, 3, 5, 6, 7]
.into_iter()
.map(|x | x*3)
收集::();
a、 延长(b);
断言!(
a、 放入iter().filter(|&x | x>5)。收集::(),
vec![6,8,9,15,18,21]
);
但是在我的例子中,额外的分配会降低性能(是的,我检查过!)

您正在寻找的

让a=vec![1,2,3,4].into_iter().map(|x | x*2);
让b=vec![0,3,5,6,7].into|iter().map(|x | x*3);
设c=a.链(b);
断言!(
c、 过滤器(|&x | x>5)。收集::(),
vec![6,8,9,15,18,21]
);

或者,您可以使用:

设a=(0..500000).map(|x | x*2);
设b=(0..500000).map(|x | x*3);
让mut c=Vec::具有_容量(a.size_hint().1.unwrap()+b.size_hint().1.unwrap());
c、 延长(a);
c、 延长(b);
这要求您明确地将
与_capacity()
一起使用,而
chain()
collect()
本可以满足您的需要。在已经构建了
a
的情况下,
extend()
将适合于构建临时向量

在本例中,我没有发现
chain()
extend
之间有任何基准差异()


这不会进行过滤

对!修复此错误表明,出于某种原因,LLVM现在不再优化
chain()
。带有
扩展的版本

设a=(0..500000).map(|x | x*2);
设b=(0..500000).map(|x | x*3);
让mut c=Vec::具有_容量(a.size_hint().1.unwrap()+b.size_hint().1.unwrap());
c、 扩展(a.filter(|&x | x>5));
c、 扩展(b.filter(|&x | x>5));
比带有
链的版本快一倍(这是我最初期望的):

设a=(0..500000).map(|x | x*2);
设b=(0..500000).map(|x | x*3);
让_c:Vec=a.chain(b).filter(|&x | x>5).collect();

()

这不会进行过滤。
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.chain(b);
assert_eq!(
    c.filter(|&x| x > 5).collect::<Vec<u8>>(),
    vec![6, 8, 9, 15, 18, 21]
);