@mykolaim
PHP developer

Возможно ли вывести элементы list используя for_each?

Нужно использовать алгоритм для выводе элементов, пытался вот так, но не работает:

list<int> test(5,10);
for_each(test,test+test.size(),show);

void show(int i){
cout<<i<<endl;
}
  • Вопрос задан
  • 351 просмотр
Решения вопроса 2
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
А почему должно? list - это вам не массив, где элементы лежат одним куском в памяти. Вообще говоря, вас не должно волновать, как они там лежат, используйте .begin() и .end() для получения итераторов на начало и конец списка. И в данном случае можно было бы применить range based for.
Ответ написан
Комментировать
TrueBers
@TrueBers
Гуглю за еду
Откройте документацию хотя бы, и прочитайте про входные параметры 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';
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы