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

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

我正在写一个埃拉托斯特尼筛法,为此你想要启动一个具有奇数索引

true
和偶数索引
false
的布尔向量。目前我的代码是:

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

但是,这无法创建交替的

true
false
序列。我怎样才能实现这个目标?

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

rust vector
2个回答
6
投票

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

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

注意迭代器确切地知道它的长度,这允许

collect
构建一个预先分配了足够容量的向量。


5
投票

您可以使用

cycle
take
collect
来完成:

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

游乐场

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