std::reverse(3)
π std::reverse(3) β bestie, this is the C++ Standard Libary page π
Okay so welcome to the glow-up of your range, no cap. This is the manual page for std::reverse(3) in the C++ Standard Libary (yes, spelled like that up top π), and we are gonna keep every detail because that's the whole vibe.
π NAME π
The name is std::reverse β and the one-liner is literally std::reverse - std::reverse. Iconic, honestly. π
β¨ Synopsis β¨
Defined in header <algorithm> β yes bestie, that's the one.
template< class BidirIt > (1)
(constexpr since C++20)
void reverse( BidirIt first, BidirIt last );
template< class ExecutionPolicy, class BidirIt >
void reverse( ExecutionPolicy&& policy, BidirIt first, (2) (since C++17)
BidirIt last );
- Reverses the order of the elements in the range
[first, last). Behaves as if applyingstd::iter_swapto every pair of iteratorsfirst + iand(last - i) - 1for each integeriin[0, std::distance(first, last) / 2). - Same as (1), but executed according to
policy. This overload participates in overload resolution only ifstd::is_execution_policy_v<std::decay_t<ExecutionPolicy>>is true. (until C++20) Since C++20, only ifstd::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>is true. (since C++20)
β οΈ If*firstis notSwappable(until C++20), orBidirItis notValueSwappable(since C++20), the behavior is undefined. That's UB, bestie β do not play with it. π
π Parameters π
first,lastβ the range of elements to reversepolicyβ the execution policy to use. See execution policy for details.
π§ Type requirements π§
BidirItmust meet the requirements ofLegacyBidirectionalIterator.
π₯ Complexity π₯
Exactly std::distance(first, last) / 2 swaps. That's the whole swap budget, periodt. β¨
π 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
ExecutionPolicyis one of the standard policies,std::terminateis called. For any otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory,
std::bad_allocis thrown.
π οΈ Possible implementation π οΈ
See also the implementations in libstdc++, libc++, and MSVC STL.
template<class BidirIt>
constexpr // since C++20
void reverse(BidirIt first, BidirIt last)
{
using iter_cat = typename std::iterator_traits<BidirIt>::iterator_category;
// Tag dispatch, e.g. calling reverse_impl(first, last, iter_cat()),
// can be used in C++14 and earlier modes.
if constexpr (std::is_base_of_v<std::random_access_iterator_tag, iter_cat>)
{
if (first == last)
return;
for (--last; first < last; (void)++first, --last)
std::iter_swap(first, last);
}
else
while (first != last && first != --last)
std::iter_swap(first++, last);
}
πΈ Notes πΈ
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. Fancy vectorized behavior, iykyk. π¦
π Example π
// Run this code
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
void println(auto rem, auto const& v)
{
for (std::cout << rem; auto e : v)
std::cout << e << ' ';
std::cout << '\n';
}
int main()
{
std::vector<int> v {1, 2, 3};
std::reverse(v.begin(), v.end());
println("after reverse, v = ", v);
int a[] = {4, 5, 6, 7};
std::reverse(std::begin(a), std::end(a));
println("after reverse, a = ", a);
}
π¨οΈ Output π¨οΈ
after reverse, v = 3 2 1
after reverse, a = 7 6 5 4
π Defect reports π
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
- LWG 223 β applied to C++98. Behavior as published:
std::swapwas applied to each pair of iterators. Correct behavior: appliesstd::iter_swapinstead. - LWG 2039 β applied to C++98. Behavior as published:
std::iter_swapwas also applied wheniequalsstd::distance(first, last) / 2. Correct behavior: not applied.
π See also π
reverse_copyβ creates a copy of a range that is reversed (function template)ranges::reverse(C++20) β reverses the order of elements in a range (niebloid)
π«Ά source/version/date sign-off:http://cppreference.com,2024.06.10,std::reverse(3)β that's the footer, bestie. Bye and slay your ranges! π β¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms