Аналогично этому вопросу: vector">Как мне чередовать два вектора Rust кусками по три в новый вектор?
Вместо этого я хотел бы выполнить противоположное поведение. Разделить итератор на два разных итератора без сбора их содержимого (например, я не хочу использовать распаковать).
Кроме того, я хочу отделить итератор, не собирая все содержимое исходного итератора.
Вот полупример:
#[derive(Debug)]
struct Foo(i32);
fn main() {
// note array elements of Foo cannot be copied or cloned
// v1: [0, 1, 2, 3]
// v2: [4, 5, 6, 7]
let v1 = (0..4).map(|num| Foo(num)).collect::<Vec<_>>();
let v2 = (4..8).map(|num| Foo(num)).collect::<Vec<_>>();
// generate interleaved iterator
// interleaved: [0, 1, 4, 5, 2, 3, 6, 7]
let interleaved = v1.chunks(2)
.zip(v2.chunks(2))
.flat_map(|(c1, c2)| c1.iter().chain(c2));
println!("interleaved: {:?}", interleaved.collect::<Vec<_>>());
// regenerate interleaved iterator
let interleaved = v1.chunks(2)
.zip(v2.chunks(2))
.flat_map(|(c1, c2)| c1.iter().chain(c2));
let mut v3: Vec<&Foo> = vec![];
let mut v4: Vec<&Foo> = vec![];
for (idx, item) in interleaved.enumerate() {
if idx % 4 < 2 {
v3.push(item);
} else {
v4.push(item);
}
}
println!("v3: {:?}, v4: {:?}", v3, v4);
}
Я хотел бы найти идиоматическое решение для отмены чередования итератора без необходимости собирать их ссылки в контейнер.
В более общем плане я хотел бы выяснить, как уменьшить итератор из n
элементов до m
элементов, где n >= m
. В этом случае я хотел бы уменьшить свой чередующийся итератор длиной 8 до итератора с фрагментами 2 длиной 4. Затем итератор с фрагментами будет разделен на два других итератора.
В этом смысле я хочу разобрать свой итератор на куски по 2.
Vec
. - person apilat   schedule 12.02.2021