Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Defined in header <algorithm> | ||
template<class InputIt,class Size,class UnaryFunc> InputIt for_each_n( InputIt first, Size n, UnaryFunc f); | (1) | (since C++17) (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt,class Size,class UnaryFunc> | (2) | (since C++17) |
Applies the given function objectf to the result of dereferencing every iterator in the range[
first,
first+ n)
. Iff returns a result, the result is ignored.
UnaryFunc
is notMoveConstructible, the behavior is undefined.std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> istrue. | (until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> istrue. | (since C++20) |
UnaryFunc
is notCopyConstructible, the behavior is undefined.Ifn>=0 is nottrue, the behavior is undefined.
If the iterator type (InputIt
/ForwardIt
) is mutable,f may modify the elements of the range through the dereferenced iterator.
Unlike the rest of the parallel algorithms,for_each_n
is not allowed to make copies of the elements in the sequence even if they areTriviallyCopyable.
Contents |
first | - | the beginning of the range to apply the function to |
n | - | the number of elements to apply the function to |
policy | - | theexecution policy to use |
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: void fun(const Type&a); The signature does not need to haveconst&. |
Type requirements | ||
-InputIt must meet the requirements ofLegacyInputIterator. | ||
-ForwardIt must meet the requirements ofLegacyForwardIterator. | ||
-Size must be convertible to an integral type. |
An iterator equal tofirst+ n, or more formally, tostd::advance(first, n).
Exactlyn applications off.
The overload with a template parameter namedExecutionPolicy
reports errors as follows:
ExecutionPolicy
is one of thestandard policies,std::terminate is called. For any otherExecutionPolicy
, the behavior is implementation-defined.See also the implementation inlibstdc++,libc++ andMSVC stdlib.
template<class InputIt,class Size,class UnaryFunc>InputIt for_each_n(InputIt first, Size n, UnaryFunc f){for(Size i=0; i< n;++first,(void)++i) f(*first); return first;} |
#include <algorithm>#include <iostream>#include <vector> void println(autoconst& v){for(auto count{v.size()};constauto& e: v)std::cout<< e<<(--count?", ":"\n");} int main(){std::vector<int> vi{1,2,3,4,5}; println(vi); std::for_each_n(vi.begin(),3,[](auto& n){ n*=2;}); println(vi);}
Output:
1, 2, 3, 4, 52, 4, 6, 4, 5
applies a function to a range of elements, storing results in a destination range (function template)[edit] | |
range-for loop(C++11) | executes loop over range[edit] |
applies a unaryfunction object to elements from arange (function template)[edit] | |
(C++20) | applies a function object to the first N elements of a sequence (algorithm function object)[edit] |