std::for_each_n
Defined in header <algorithm> | ||
|---|---|---|
| (1) | ||
template< class InputIt, class Size, class UnaryFunction > InputIt for_each_n( InputIt first, Size n, UnaryFunction f ); | (since C++17) (until C++20) | |
template< class InputIt, class Size, class UnaryFunction > constexpr InputIt for_each_n( InputIt first, Size n, UnaryFunction f ); | (since C++20) | |
template< class ExecutionPolicy, class ForwardIt, class Size, class UnaryFunction2 > ForwardIt for_each_n( ExecutionPolicy&& policy, ForwardIt first, Size n, UnaryFunction2 f ); | (2) | (since C++17) |
f to the result of dereferencing every iterator in the range [first, first + n), in order. f to the result of dereferencing every iterator in the range [first, first + n) (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. If n is less than zero, the behavior is undefined.
Parameters
| first | - | the beginning of the range to apply the function to |
| n | - | the number of elements to apply the function to |
| policy | - | the execution policy to use. See execution policy for details. |
| f | - | function object, to be applied to the result of dereferencing every iterator in the range [first, first + n) The signature of the function should be equivalent to the following:
The signature does not need to have |
| Type requirements | ||
-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. |
||
Return value
first + n.
Complexity
Exactly n applications of f.
Exceptions
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
ExecutionPolicyis one of the standard policies,std::terminateis called. For any otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory,
std::bad_allocis thrown.
Possible implementation
template<class InputIt, class Size, class UnaryFunction>
InputIt for_each_n(InputIt first, Size n, UnaryFunction f)
{
for (Size i = 0; i < n; ++first, (void) ++i) {
f(*first);
}
return first;
} |
Example
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> ns{1, 2, 3, 4, 5};
for (auto n: ns) std::cout << n << ", ";
std::cout << '\n';
std::for_each_n(ns.begin(), 3, [](auto& n){ n *= 2; });
for (auto n: ns) std::cout << n << ", ";
std::cout << '\n';
}Output:
1, 2, 3, 4, 5, 2, 4, 6, 4, 5,
See also
| applies a function to a range of elements (function template) |
|
| range-for loop | executes loop over range (since C++11) |
| applies a function to a range of elements (function template) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/algorithm/for_each_n