Удаление всех элементов, равных единице, из std::vector

Используйте erase-remove idiom, а в C++20 — std::erase(vec, 1). Это удаляет все единицы за линейное время, не выполняя отдельное сдвигание хвоста после каждого совпадения.

Короткий ответ

Что ответить на собеседовании

Используйте erase-remove idiom, а в C++20 — std::erase(vec, 1). Это удаляет все единицы за линейное время, не выполняя отдельное сдвигание хвоста после каждого совпадения.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо избавиться от всех значений 1, присутствующих в контейнере‑вектор, используя максимально эффективный подход.

std::vector<int> vec = {1, 5, 4, 1, 10, 1, 33, 300};
// удалить все элементы, равные 1

Ответ

Используйте erase-remove idiom, а в C++20 — std::erase(vec, 1). Это удаляет все единицы за линейное время, не выполняя отдельное сдвигание хвоста после каждого совпадения.

vec.erase(std::remove(vec.begin(), vec.end(), 1), vec.end());

Нужен . Результат: 5, 4, 10, 33, 300. std::remove сам не уменьшает размер: он перемещает сохраняемые элементы вперёд и возвращает новую логическую границу, после чего erase сокращает контейнер.

Альтернатива C++20: std::erase(vec, 1);. Порядок оставшихся элементов сохраняется. Старые итераторы нельзя без проверки использовать после изменения контейнера.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее