Откройте
документацию хотя бы, и прочитайте про входные параметры for_each:
template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
От вас требуют на вход итератор на первый элемент
first
и итератор на последний элемент
last
. Ниже можно найти, что
InputIt
значит
InputIterator.
Теперь смотрим
документацию std::list.
Iterators
begin returns an iterator to the beginning
cbegin (public member function)
end returns an iterator to the end
cend (public member function)
То, что нам нужно.
begin()
даст нам итератор на первый элемент, т.е.
first
, а
end()
— на
last
.
Смотрим дальше
Member types
Member type Definition
iterator BidirectionalIterator
Смотрим, что такое
BidirectionalIterator. Написано, что он должен быть в свою очередь
ForwardIterator'ом. А
ForwardIterator
удовлетворяет концепту
InputIterator
. Как раз то, что нам нужно.
В итоге, достаточно написать
for_each(test.begin(), test.end(), show);
Но, сейчас на дворе 2017 год, давно уже введены новые фишки в C++. Например, можно сходу передать анонимную функцию (лямбду) вместо обычной функции, в случае, если она однострочная:
for_each(test.cbegin(), test.cend(), [](int v) {std::cout << v << std::endl;});
Также, C++11 добавляет новые методы для получения константного итератора
cbegin()
и
cend()
, т. к. нам не нужно модифицировать список, лучше воспользоваться константными итераторами, чтобы избежать ошибок в случае случайной модификации.
Либо, как уже сказали, если у вас слишком большое тело цикла, чтобы не городить из лямбд спагетти и чтобы это всё легко читалось, можно использовать
range-for:
for(const auto &v : test)
std::cout << n << ' ';
std::cout << '\n';