std::for_each (3) - Linux Man Pages
Defined in header <algorithm>
template< class InputIt, class UnaryFunction > (until C++20)
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
template< class InputIt, class UnaryFunction > (1) (since C++20)
constexpr UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
template< class ExecutionPolicy, class ForwardIt, class UnaryFunction2 > (2) (since C++17)
void for_each( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, UnaryFunction2 f );
1) Applies the given function object f to the result of dereferencing every iterator in the range [first, last), in order.
2) Applies the given function object f to the result of dereferencing every iterator in the range [first, last) (not necessarily in order). The algorithm is executed according to policy. This overload does not participate in overload resolution unless std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true.
For both overloads, if the iterator type is mutable, f may modify the elements of the range through the dereferenced iterator. If f returns a result, the result is ignored.
Unlike the rest of the algorithms, for_each is not allowed to make copies of the elements in the sequence even if they are trivially copyable.
first, last - the range to apply the function to
policy - the execution policy to use. See execution_policy for details.
f - void fun(const Type &a);
InputIt must meet the requirements of LegacyInputIterator.
ForwardIt must meet the requirements of LegacyForwardIterator.
UnaryFunction must meet the requirements of MoveConstructible. Does not have to be CopyConstructible
UnaryFunction2 must meet the requirements of CopyConstructible.
Exactly last - first applications of f
The overload with a template parameter named ExecutionPolicy reports errors as follows:
* If execution of a function invoked as part of the algorithm throws an exception and ExecutionPolicy is one of the standard_policies, std::terminate is called. For any other ExecutionPolicy, the behavior is implementation-defined.
* If the algorithm fails to allocate memory, std::bad_alloc is thrown.
The following example uses a lambda_function to increment all of the elements of a vector and then uses an overloaded operator() in a functor to compute their sum. Note that to compute the sum, it is recommended to use the dedicated algorithm std::accumulate.
// Run this code
transform (function template)
range-for_loop executes loop over range (since C++11)
for_each_n applies a function object to the first n elements of a sequence