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 BidirIt,class OutputIt> OutputIt reverse_copy( BidirIt first, BidirIt last, | (1) | (constexpr since C++20) |
template<class ExecutionPolicy,class BidirIt,class ForwardIt> ForwardIt reverse_copy( ExecutionPolicy&& policy, | (2) | (since C++17) |
[
first,
last)
(source range) to another range of\(\scriptsize N\)N elements beginning atd_first (destination range) in such a way that the elements in the destination range are in reverse order.[
0,
N)
.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) |
Contents |
first, last | - | the pair of iterators defining the sourcerange of elements to copy |
d_first | - | the beginning of the destination range |
Type requirements | ||
-BidirIt must meet the requirements ofLegacyBidirectionalIterator. | ||
-OutputIt must meet the requirements ofLegacyOutputIterator. | ||
-ForwardIt must meet the requirements ofLegacyForwardIterator. |
Output iterator to the element past the last element copied.
Exactly\(\scriptsize N\)N assignments.
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 implementations inlibstdc++,libc++, andMSVC STL.
template<class BidirIt,class OutputIt>constexpr// since C++20OutputIt reverse_copy(BidirIt first, BidirIt last, OutputIt d_first){for(; first!= last;++d_first)*d_first=*(--last);return d_first;} |
Implementations (e.g.MSVC STL) may enable vectorization when the both iterator types satisfyLegacyContiguousIterator and have the same value type, and the value type isTriviallyCopyable.
#include <algorithm>#include <iostream>#include <vector> int main(){auto print=[](conststd::vector<int>& v){for(constauto& value: v)std::cout<< value<<' ';std::cout<<'\n';}; std::vector<int> v{1,2,3}; print(v); std::vector<int> destination(3); std::reverse_copy(std::begin(v),std::end(v),std::begin(destination)); print(destination); std::reverse_copy(std::rbegin(v),std::rend(v),std::begin(destination)); print(destination);}
Output:
1 2 3 3 2 1 1 2 3
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 2074 | C++98 | for eachi, the assignment was *(d_first+ N- i)=*(first+ i)[1] | corrected to *(d_first+ N-1- i)=*(first+ i)[1] |
LWG 2150 | C++98 | only one element was required to be assigned | corrected the requirement |
+
and-
. The usages of+
and-
here are exposition-only: the actual computation does not need to use them. reverses the order of elements in a range (function template)[edit] | |
(C++20) | creates a copy of a range that is reversed (algorithm function object)[edit] |