std::rotate (3) Linux Manual Page
std::rotate – std::rotate
Synopsis
Defined in header<algorithm>
template <class ForwardIt>
(until C++ 11)
void rotate(ForwardIt first, ForwardIt n_first, ForwardIt last);
template <class ForwardIt>
(since C++ 11)
ForwardIt rotate(ForwardIt first, ForwardIt n_first, ForwardIt last);
(until C++ 20)
template <class ForwardIt>
(1)(since C++ 20)
constexpr ForwardIt rotate(ForwardIt first, ForwardIt n_first, ForwardIt last);
template <class ExecutionPolicy, class ForwardIt>
ForwardIt rotate(ExecutionPolicy &&policy, (2)(since C++ 17)
ForwardIt first,
ForwardIt n_first, ForwardIt last);
1) Performs a left rotation on a range of elements.
Specifically, std::rotate swaps the elements in the range [first, last) in such a way that the element n_first becomes the first element of the new range and n_first – 1 becomes the last element.
A precondition of this function is that [first, n_first) and [n_first, last) are valid ranges.
2) Same as (1), but executed according to policy. This overload does not participate in overload resolution unless std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true
Parameters
first – the beginning of the original range
n_first – the element that should appear at the beginning of the rotated range
last – the end of the original range
policy – the execution policy to use. See execution_policy for details.
Type requirements
–
ForwardIt must meet the requirements of ValueSwappable and LegacyForwardIterator.
–
The type of dereferenced ForwardIt must meet the requirements of MoveAssignable and MoveConstructible.
Return value
(none) (until C++11)
The iterator equal to first + (last – n_first) (since C++11)
Complexity
Linear in the distance between first and last
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 other ExecutionPolicy, the behavior is implementation-defined.
* If the algorithm fails to allocate memory, std::bad_alloc is thrown.
Possible implementation
See also the implementations in libstdc++ and libc++.
Example
std::rotate is a common building block in many algorithms. This example demonstrates insertion sort:
// Run this code
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1};
std::cout << "before sort: ";
for (int n : v)
std::cout << n << ' ';
std::cout << '\n';
// insertion sort
for (auto i = v.begin(); i != v.end(); ++i) {
std::rotate(std::upper_bound(v.begin(), i, *i), i, i + 1);
}
std::cout << "after sort: ";
for (int n : v)
std::cout << n << ' ';
std::cout << '\n';
// simple rotation to the left
std::rotate(v.begin(), v.begin() + 1, v.end());
std::cout << "simple rotate left : ";
for (int n : v)
std::cout << n << ' ';
std::cout << '\n';
// simple rotation to the right
std::rotate(v.rbegin(), v.rbegin() + 1, v.rend());
std::cout << "simple rotate right : ";
for (int n : v)
std::cout << n << ' ';
std::cout << '\n';
}
Output:
See also
rotate_copy (function template)
