Удалить последние n элементов вектора по частям

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

Я думал о чем-то подобном, но я не знаю, что сбор внутри карты очень эффективен. let a: Vec<_> = v.chunks_exact(6).map(|x| x.iter().take(3).collect::<Vec<_>>()).flatten().collect();

daniellga 09.02.2023 06:45
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы просто отфильтровал по индексу (который вы можете получить с помощью .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();

daniellga 09.02.2023 07:08

Если вам не нужен оригинальный Vec без изменений, это лучше всего написать с сохранить.

drewtato 09.02.2023 08:20

@daniellga, вы должны добавить это и комментарий к вашему вопросу в качестве ответа, оба комментария не являются хорошими, оба являются правильными ответами.

cafce25 09.02.2023 10:32

Другие вопросы по теме