std::rotate_copy
From cppreference.com
| Defined in header <algorithm>
|
||
template< class ForwardIt, class OutputIt >
OutputIt rotate_copy( ForwardIt first, ForwardIt middle,
ForwardIt last, OutputIt d_first );
|
(1) | (constexpr since C++20) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2 >
ForwardIt2 rotate_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 middle,
ForwardIt1 last, ForwardIt2 d_first );
|
(2) | (since C++17) |
1) Copies elements from the source range
[first, last) to the destination range beginning at d_first in rotated order. In the destination range, the elements originally in [first, middle) are placed after the elements originally 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 the value of the following expression is
true:
|
|
(until C++20) |
|
|
(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.
Parameters
| first, last | - | the pair of iterators defining the source range |
| middle | - | the beginning of the part that should appear at the beginning of the destination range |
| d_first | - | the 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.
| ||
Return value
The past-the-end iterator of the destination range.
Complexity
Exactly std::distance(first, last) assignments.
Exceptions
2) During the execution process:
- If the temporary memory resources required for parallelization are not available, std::bad_alloc is thrown.
- If an uncaught exception is thrown while accessing objects via an algorithm argument, the behavior is determined by the execution policy (for standard policies, std::terminate is invoked).
Possible implementation
See also the implementations in libstdc++, libc++, and MSVC STL.
template<class ForwardIt, class OutputIt>
constexpr // since C++20
OutputIt rotate_copy(ForwardIt first, ForwardIt middle,
ForwardIt last, OutputIt d_first)
{
d_first = std::copy(middle, last, d_first);
return std::copy(first, middle, d_first);
}
|
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
See also
(C++20) |
copies and rotate a range of elements (algorithm function object) |
| rotates the order of elements in a range (function template & algorithm function object) | |
(C++20) |