Программа напечатает 16: первый элемент станет 1, а размер списка останется 6. std::remove_if перемещает сохраняемые значения, но не удаляет узлы контейнера.
Какой текст появится в консоли после запуска программы
Программа напечатает 16: первый элемент станет 1, а размер списка останется 6. std::remove_if перемещает сохраняемые значения, но не удаляет узлы контейнера.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо предсказать, какой результат будет выведен в консоль при выполнении следующего C++‑кода.
#include <algorithm>
#include <iostream>
#include <list>
bool IsEven(int value)
{
return value % 2 == 0;
}
void ProcessAndShow()
{
std::list<int> numbers = {0, 1, 2, 3, 4, 5};
std::remove_if(numbers.begin(), numbers.end(), IsEven);
std::cout << numbers.front() << numbers.size() << std::endl;
}
int main()
{
ProcessAndShow();
return 0;
}
Ответ
Программа напечатает 16: первый элемент станет 1, а размер списка останется 6. std::remove_if перемещает сохраняемые значения, но не удаляет узлы контейнера.
После алгоритма в начале диапазона расположены 1, 3 и 5. Возвращённый итератор обозначает логический конец; код его игнорирует. На значения после этого итератора полагаться не следует, но numbers.size() по-прежнему равен 6.
Для std::list проще вызвать numbers.remove_if(IsEven);: метод действительно удаляет подходящие узлы. Тогда вывод будет 13. Альтернатива для подходящих контейнеров — erase-remove: numbers.erase(std::remove_if(numbers.begin(), numbers.end(), IsEven), numbers.end());. Между числами в исходном выводе пробела нет.