我有一个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;
}
这是我到目前为止使用enumerate
和filter
所获得的:
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
};
这感觉有点复杂。有没有更简单的方法可以做到这一点?
我还看到在每个迭代中都构造了一个元组,然后在每个替代迭代中都将其丢弃。这似乎效率低下。有没有一种方法而无需构造中间元组?
答案 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
}