std::experimental::ranges:: for_each
|
Определено в заголовочном файле
<experimental/ranges/algorithm>
|
||
|
template
<
InputIterator I, Sentinel
<
I
>
S,
class
Proj
=
ranges::
identity
,
IndirectUnaryInvocable
<
projected
<
I, Proj
>>
Fun
>
|
(1) | (ranges TS) |
|
template
<
InputRange R,
class
Proj
=
ranges::
identity
,
IndirectUnaryInvocable
<
projected
<
ranges::
iterator_t
<
R
>
, Proj
>>
Fun
>
|
(2) | (ranges TS) |
[
first
,
last
)
(т.е.
ranges::
invoke
(
f,
ranges::
invoke
(
proj,
*
i
)
)
), в порядке следования.
Для обеих перегрузок, если тип итератора является изменяемым, 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 элементам последовательности
(шаблон функции) |