在反向迭代器中产生偶数

问题描述 投票:0回答:1

我希望创建一个迭代器,它可以从相反顺序的值中生成偶数。

此代码按升序执行此操作

let a = (2..6)
        .step_by(2)
        .map(|x| x.to_string() + " ")
        .collect();
println!("{a}"); // prints 2 4

如果我扭转这个

let a = (2..6).rev()
        .step_by(2)
        .map(|x| x.to_string() + " ")
        .collect();
println!("{a}"); // prints 5 3

从任何最大值获得正确迭代器的方法是什么,例如。会产生正确反转序列的一个

[4, 2]

rust iterator
1个回答
0
投票

step_by(2)
在迭代器严格交替偶数和奇数的假设下工作,但也以偶数开始。对于以偶数开头的 Range
 来说是这样,但对于每个 
Range
 的反转来说则不然。特别是,
(2..6).rev()
的第一个元素是奇数。

要适应可能以奇数开头的反向范围,请使用

skip_while

:

let a = (2..6).rev() .skip_while(|x| x % 2 == 1) .step_by(2) .map(|x| x.to_string() + " ") .collect(); println!("{a}"); // prints 5 3

(2..6).rev()

5
 开头,但 
(2..6).rev().skips_while(...)
4
 开头。请注意, 
(2..5).rev()
(2..5).rev().skips_while(...)
 是等效的,因为原始迭代器中的任何内容都不会被跳过。

关于效率,与

相比,谓词将应用于最多2个元素,以满足

step_by(2)
所需的前提条件

let a = (2..6).rev() .filter(|x| x % 2 == 0) .map(|x| x.to_string() + " ") .collect();
不能使用有关 

(2..6).rev()

 结构的任何信息来应用给定谓词少于 O(n) 次。

© www.soinside.com 2019 - 2024. All rights reserved.