我有两个迭代器,它们最终将合并到同一个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]
);但在我的情况下,额外的分配会降低性能(是的,我检查过了!)
发布于 2019-03-14 06:50:02
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]
);发布于 2019-03-14 19:55:47
或者,您可以使用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()将是合适的,而不是构建临时向量。
在本例中,我没有发现chain()和extend之间有任何基准差异(基准测试)。
这不能进行过滤。塞巴斯蒂安·雷德尔
对,是这样!修复此错误表明,由于某种原因,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();(基准测试)
https://stackoverflow.com/questions/55156459
复制相似问题