template< class ForwardIt >
ForwardIt rotate( ForwardIt first, ForwardIt middle, ForwardIt last );
ForwardIt rotate( ExecutionPolicy&& policy,
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 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:
If any of the following conditions is satisfied, the behavior is undefined:
[
first,
middle)
or [
middle,
last)
is not a valid range.ForwardIt
must meet the requirements of LegacyForwardIterator. [edit] Return value
The iterator to the element originally referenced by *first, i.e. the std::distance(middle, last)th next iterator of first.
[edit] ComplexityAt most std::distance(first, last) swaps.
[edit] ExceptionsThe overload with a template parameter named ExecutionPolicy
reports errors as follows:
ExecutionPolicy
is one of the standard policies, std::terminate is called. For any other ExecutionPolicy
, the behavior is implementation-defined.See also the implementations in libstdc++, libc++, and MSVC STL.
template<class ForwardIt> constexpr // since C++20 ForwardIt rotate(ForwardIt first, ForwardIt middle, ForwardIt last) { if (first == middle) return last; if (middle == last) return first; ForwardIt write = first; ForwardIt next_read = first; // read position for when âreadâ hits âlastâ for (ForwardIt read = middle; read != last; ++write, ++read) { if (write == next_read) next_read = read; // track where âfirstâ went std::iter_swap(write, read); } // rotate the remaining sequence into place rotate(write, next_read, last); return write; }[edit] Notes
std::rotate
has better efficiency on common implementations if ForwardIt
satisfies LegacyBidirectionalIterator or (better) LegacyRandomAccessIterator.
Implementations (e.g. MSVC STL) may enable vectorization when the iterator type satisfies LegacyContiguousIterator and swapping its value type calls neither non-trivial special member function nor ADL-found swap
.
std::rotate
is a common building block in many algorithms. This example demonstrates insertion sort.
#include <algorithm> #include <iostream> #include <vector> auto print = [](const auto remark, const auto& v) { std::cout << remark; for (auto n : v) std::cout << n << ' '; std::cout << '\n'; }; int main() { std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1}; print("before sort:\t\t", v); // insertion sort for (auto i = v.begin(); i != v.end(); ++i) std::rotate(std::upper_bound(v.begin(), i, *i), i, i + 1); print("after sort:\t\t", v); // simple rotation to the left std::rotate(v.begin(), v.begin() + 1, v.end()); print("simple rotate left:\t", v); // simple rotation to the right std::rotate(v.rbegin(), v.rbegin() + 1, v.rend()); print("simple rotate right:\t", v); }
Output:
before sort: 2 4 2 0 5 10 7 3 7 1 after sort: 0 1 2 2 3 4 5 7 7 10 simple rotate left: 1 2 2 3 4 5 7 7 10 0 simple rotate right: 0 1 2 2 3 4 5 7 7 10[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior LWG 488 C++98 the new location of the element pointed by first was not returned returned [edit] See alsoRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4