std::rotate_copy
From cppreference.com
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 the left rotation of [
first,
last)
to d_first.
1) Copies the elements from the range
[
first,
last)
, such that in the destination range beginning at d_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.2) Same as (1), but executed according to policy.
This overload participates in overload resolution only if all following conditions are satisfied:
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true. | (until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> is true. | (since C++20) |
If any of the following conditions is satisfied, the behavior is undefined:
[
first,
middle)
or[
middle,
last)
is not a valid range.- The source and destination ranges overlap.
Contents |
[edit] Parameters
first, last | - | the pair of iterators defining the source range 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 | - | the execution policy to use |
Type requirements | ||
-ForwardIt, ForwardIt1, ForwardIt2 must meet the requirements of LegacyForwardIterator. | ||
-OutputIt must meet the requirements of LegacyOutputIterator. |
[edit] Return value
Output iterator to the element past the last element copied.
[edit] Complexity
Exactly std::distance(first, last) assignments.
[edit] 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
ExecutionPolicy
is one of the standard policies, std::terminate is called. For any otherExecutionPolicy
, the behavior is implementation-defined. - If the algorithm fails to allocate memory, std::bad_alloc is thrown.
[edit] Possible implementation
See also the implementations in libstdc++, libc++, and MSVC STL.
[edit] Example
Run this code
#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 2 1 2 3 4 5
[edit] See also
rotates the order of elements in a range (function template) | |
(C++20) | copies and rotate a range of elements (algorithm function object) |