Какой текст появится в консоли после запуска программы

Программа напечатает 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());. Между числами в исходном выводе пробела нет.

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

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

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

Подробнее