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 ForwardIt,class OutputIt> OutputIt rotate_copy( ForwardIt first, ForwardIt middle, | (1) | (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt1,class ForwardIt2> | (2) | (since C++17) |
Copies theleft rotation of[
first,
last)
tod_first.
[
first,
last)
, such that in the destination range beginning atd_first, the elements in[
first,
middle)
are placed after the elements in[
middle,
last)
while the orders of the elements in both ranges are preserved.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) |
If any of the following conditions is satisfied, the behavior is undefined:
[
first,
middle)
or[
middle,
last)
is not avalid range.Contents |
first, last | - | the pair of iterators defining the sourcerange of elements to copy |
middle | - | an iterator to an element in[ first, last) that should appear at the beginning of the new range |
d_first | - | beginning of the destination range |
policy | - | theexecution policy to use |
Type requirements | ||
-ForwardIt, ForwardIt1, ForwardIt2 must meet the requirements ofLegacyForwardIterator. | ||
-OutputIt must meet the requirements ofLegacyOutputIterator. |
Output iterator to the element past the last element copied.
Exactlystd::distance(first, last) 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.
#include <algorithm>#include <iostream>#include <iterator>#include <vector> int main(){std::vector<int> src{1,2,3,4,5};std::vector<int> dest(src.size());auto pivot=std::find(src.begin(), src.end(),3); std::rotate_copy(src.begin(), pivot, src.end(), dest.begin());for(int i: dest)std::cout<< i<<' ';std::cout<<'\n'; // copy the rotation result directly to the std::cout pivot=std::find(dest.begin(), dest.end(),1); std::rotate_copy(dest.begin(), pivot, dest.end(),std::ostream_iterator<int>(std::cout," "));std::cout<<'\n';}
Output:
3 4 5 1 21 2 3 4 5
rotates the order of elements in a range (function template)[edit] | |
(C++20) | copies and rotate a range of elements (algorithm function object)[edit] |