首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有办法将两个迭代器合并到同一个Vec中吗?

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

Stack Overflow用户
提问于 2019-03-14 06:45:27
回答 2查看 7.8K关注 0票数 9

我有两个迭代器,它们最终将合并到同一个Vec中,但是在合并之前,我需要对最终结果执行一个过滤器。例如:

代码语言:javascript
复制
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]
);

我可以这样做:

代码语言:javascript
复制
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]
);

但在我的情况下,额外的分配会降低性能(是的,我检查过了!)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-14 06:50:02

你在找Iterator::chain

代码语言:javascript
复制
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]
);
票数 19
EN

Stack Overflow用户

发布于 2019-03-14 19:55:47

或者,您可以使用extend()

代码语言:javascript
复制
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的版本

代码语言:javascript
复制
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版本的两倍(这是我最初所期望的):

代码语言:javascript
复制
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();

(基准测试)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55156459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档