在Rust中迭代Vec的备用元素的最佳方法是什么?

时间:2019-03-09 15:08:03

标签: rust

我有一个Vec<usize>,想遍历其中的所有偶数元素。基本上,我想了解以下C ++代码的理想Rust等效项:

const std::vector<uint64_t> vector{1, 4, 9, 16, 25};

for (uint64_t index = 0; index < vector.size(); index += 2) {
    std::cout << vector[index] << std::endl;
}

这是我到目前为止使用enumeratefilter所获得的:

let vector: Vec<usize> = vec![1, 4, 9, 16, 25];

// Prints even-indexed numbers from the Vec.
type PredicateType = fn(&(usize, &usize)) -> bool;
let predicate: PredicateType = |&tuple| tuple.0 % 2 == 0;
for tuple in vector.iter().enumerate().filter(predicate) {
    println!("{:?}", tuple.1); // Prints 1, 9, and 25
};

这感觉有点复杂。有没有更简单的方法可以做到这一点?

我还看到在每个迭代中都构造了一个元组,然后在每个替代迭代中都将其丢弃。这似乎效率低下。有没有一种方法而无需构造中间元组?

2 个答案:

答案 0 :(得分:0)

使用step_by

let data = vec![1,2,3,4,5,6,7];

for x in data.iter().step_by(2) {
    println!("{}", x)
}

输出:

1
3
5
7

答案 1 :(得分:0)

您应该使用step_by迭代器方法,该方法将逐步跳转:

let vector: Vec<usize> = vec![1, 4, 9, 16, 25];

// Prints even-indexed numbers from the Vec.
for item in vector.iter().step_by(2) {
    println!("{:?}", item); // Prints 1, 9, and 25
}

要从不同于0的索引处开始,请将其与skip组合:

// Prints odd-indexed numbers from the Vec.
for item in vector.iter().skip(1).step_by(2) {
    println!("{:?}", item); // Prints 4, 16
}

(Rust playground link)