Имея vec![1,2,3,4,5,6,7,8,9,10,11,12], я хотел бы удалить кусками по 6 элементов последние 3 элемента, чтобы результатом был срез или вектор, подобный [1,2,3,7,8,9]. Есть ли простой способ сделать это без промежуточных распределений (например, сбора небольших векторов), желательно с использованием итераторов?
Спасибо!

Я бы просто отфильтровал по индексу (который вы можете получить с помощью .enumerate())
fn main() {
let data = vec![1,2,3,4,5,6,7,8,9,10,11,12];
let new_data: Vec<i32> = data.iter()
.enumerate()
.filter(|(i, _)| (*i / 3) % 2 == 0)
.map(|(_, v)| *v) // you could have this be Vec<&i32>, but I don't think you'd save memory/time. if it was a more complex data type, references would save memory and time
.collect();
println!("{new_data:?}");
}
0 / 3 == 0, 0 % 2 == 0, ? 0 == 0 -> true так держать1 / 3 == 0, 0 % 2 == 0, ? 0 == 0 -> true так держать2 / 3 == 0, 0 % 2 == 0, ? 0 == 0 -> true так держать3 / 3 == 1, 1 % 2 == 1, ? 1 == 0 -> false так что пропустите4 / 3 == 1, 1 % 2 == 1, ? 1 == 0 -> false так что пропустите5 / 3 == 1, 1 % 2 == 1, ? 1 == 0 -> false так что пропустите6 / 3 == 2, 2 % 2 == 0, ? 0 == 0 -> true так держать
...
Спасибо! На самом деле я только что узнал о flat_map: let a: Vec<_> = v.chunks_exact(6).flat_map(|x| x.iter().take(3)).collect();
Если вам не нужен оригинальный Vec без изменений, это лучше всего написать с сохранить.
@daniellga, вы должны добавить это и комментарий к вашему вопросу в качестве ответа, оба комментария не являются хорошими, оба являются правильными ответами.
Я думал о чем-то подобном, но я не знаю, что сбор внутри карты очень эффективен.
let a: Vec<_> = v.chunks_exact(6).map(|x| x.iter().take(3).collect::<Vec<_>>()).flatten().collect();