Namespaces
Variants

std::experimental::ranges:: for_each

From cppreference.net
Определено в заголовочном файле <experimental/ranges/algorithm>
template < InputIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectUnaryInvocable < projected < I, Proj >> Fun >
ranges:: tagged_pair < tag:: in ( I ) , tag:: fun ( Fun ) >

for_each ( I first, S last, Fun f, Proj proj = Proj { } ) ;
(1) (ranges TS)
template < InputRange R, class Proj = ranges:: identity ,

IndirectUnaryInvocable < projected < ranges:: iterator_t < R > , Proj >> Fun >
ranges:: tagged_pair < tag:: in ( ranges:: safe_iterator_t < R > ) , tag:: fun ( Fun ) >

for_each ( R && r, Fun f, Proj proj = Proj { } ) ;
(2) (ranges TS)
1) Вызывает заданный функциональный объект f для результата вызова проекции proj на разыменованном значении каждого итератора в диапазоне [ first , last ) (т.е. ranges:: invoke ( f, ranges:: invoke ( proj, * i ) ) ), в порядке следования.
2) То же, что и (1) , но использует r в качестве исходного диапазона, как если бы использовались ranges:: begin ( r ) в качестве first и ranges:: end ( r ) в качестве last .

Для обеих перегрузок, если тип итератора является изменяемым, f может изменять элементы диапазона через разыменованный итератор. Если f возвращает результат, он игнорируется.

В отличие от остальных алгоритмов, for_each не разрешено создавать копии элементов в последовательности, даже если они тривиально копируемы.

В отличие от std::for_each (который требует только MoveConstructible ), эти функции требуют, чтобы Fun соответствовал концепции CopyConstructible .

Несмотря на приведённые выше объявления, фактическое количество и порядок параметров шаблона для объявлений алгоритмов не определено. Таким образом, если при вызове алгоритма используются явные аргументы шаблона, программа, вероятно, является непереносимой.

Содержание

Параметры

first, last - диапазон для применения функции
r - диапазон для применения функции
f - вызываемый объект для применения к каждому проецируемому элементу в диапазоне
proj - проекция для применения к элементам

Возвращаемое значение

Объект tagged_pair содержащий следующие два члена:

  • Первый член с тегом tag::in является конечным итератором исходного диапазона (то есть итератором типа I , который сравнивается с сентинелом last ).
  • Второй член с тегом tag::fun инициализируется из std::move(f) (после всех применений функционального объекта).

Сложность

Ровно last - first применений f и proj .

Возможная реализация

template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryInvocable<ranges::projected<I, Proj>> Fun>
auto for_each(I first, S last, Fun f, Proj proj = Proj{}) 
    -> ranges::tagged_pair<tag::in(I), tag::fun(Fun)>
{
    for (; first != last; ++first)
        ranges::invoke(f, ranges::invoke(proj, *first));
    return {std::move(first), std::move(f)};
}

Пример

Смотрите также

применяет функцию к диапазону элементов
(шаблон функции)
range- for loop (C++11) выполняет цикл по диапазону
применяет унарный function object к элементам из range
(шаблон функции)
(C++17)
применяет function object к первым N элементам последовательности
(шаблон функции)