如何根据重复序列构建向量?

Pio*_*_11 0 vector rust

我正在写一个埃拉托斯特尼筛法,为此你想要启动一个具有奇数索引true和偶数索引的布尔向量false。目前我的代码是:

let mut is_prime: Vec<bool> = vec![true; capacity];
is_prime.iter_mut().step_by(2).for_each(|m| *m = false);
Run Code Online (Sandbox Code Playgroud)

然而,这并不能创建交替true false序列。我怎样才能实现这个目标?

注意:我知道在这种情况下这不会对性能产生巨大影响,但我认为这是一个有趣的问题,并且怀疑在某些情况下它可能会产生影响。

cdh*_*wie 6

您可以组合一些迭代器实用程序来高效且符合人体工程学地完成此操作:

let mut is_prime: Vec<_> = std::iter::repeat([true, false])
    .flatten()
    .take(capacity)
    .collect();
Run Code Online (Sandbox Code Playgroud)

请注意,迭代器确切地知道其长度,这允许collect构建一个预先分配了足够容量的向量。


Jmb*_*Jmb 5

您可以使用cycle,take和 来做到这一点collect

let mut sieve: Vec<_> = [ false, true ].into_iter().cycle().take (capacity).collect();
Run Code Online (Sandbox Code Playgroud)

操场