Используйте erase-remove idiom, а в C++20 — std::erase(vec, 1). Это удаляет все единицы за линейное время, не выполняя отдельное сдвигание хвоста после каждого совпадения.
Удаление всех элементов, равных единице, из std::vector
Используйте 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);. Порядок оставшихся элементов сохраняется. Старые итераторы нельзя без проверки использовать после изменения контейнера.