Каков наилучший способ перебрать альтернативные элементы Vec в Rust? - PullRequest
1 голос
/ 09 марта 2019

У меня есть Vec<usize>, и я хотел бы перебрать все четные элементы в нем.По сути, я хотел бы понять идеальный эквивалент Rust для следующего кода C ++:

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
};

Это кажется немного сложным.Есть ли более простой способ сделать это?

Также я вижу, что кортеж создается на каждой итерации, а затем отбрасывается на каждой альтернативной итерации.Это кажется неэффективным.Есть ли способ сделать это без создания промежуточного кортежа?

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Вы должны использовать метод итератора 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)

0 голосов
/ 09 марта 2019

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...