循环 Rust 迭代器给定次数

Jea*_*ett 9 iterator cycle rust

如何在迭代器中循环有限次?

我希望这样的输出是1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3然后停止:

vec![1, 2, 3].iter().cycle(4)
//                         ^ but .cycle() doesn't take an argument...
Run Code Online (Sandbox Code Playgroud)

我不知道迭代器的长度。

edw*_*rdw 11

一种简单的方法是重复迭代器本身,取前 4 个并展平:

fn main() {
    let v = vec![1, 2, 3];
    let res = std::iter::repeat(v.iter())
        .take(4)
        .flatten()
        .collect::<Vec<_>>();
    dbg!(res);
}
Run Code Online (Sandbox Code Playgroud)

使用此要点中的代码比较 3 种不同方法的一些微基准测试结果:

  • 在这个答案中重复采取扁平化
  • 手卷圈
  • 一个cycle_n实现模仿Iterator::cycle.

值得称赞的是rustccycle_n当输入相当大时,始终优于其他两个,而 repeat-take-flatten 在小输入时表现最佳。

repeat-take-flatten、hand-rolled loop 和 <code>cycle_n</code> 之间的微基准测试