std::reverse - cppreference.com (original) (raw)

Defined in header
template< class BidirIt > void reverse( BidirIt first, BidirIt last ); (1) (constexpr since C++20)
template< class ExecutionPolicy, class BidirIt > void reverse( ExecutionPolicy&& policy, BidirIt first, BidirIt last ); (2) (since C++17)
  1. Reverses the order of the elements in the range [first, last).

Behaves as if applying std::iter_swap to every pair of iterators first + i and (last - i) - 1 for each integer i in [​0​, std::distance(first, last) / 2).

  1. Same as (1), but executed according to policy.

This overload participates in overload resolution only if all following conditions are satisfied:

If *first is not Swappable(until C++20)BidirIt is not ValueSwappable(since C++20), the behavior is undefined.

Contents

[edit] Parameters

first, last - the pair of iterators defining the range of elements to reverse
policy - the execution policy to use
Type requirements
-BidirIt must meet the requirements of LegacyBidirectionalIterator.

[edit] Complexity

Exactly std::distance(first, last) / 2 swaps.

[edit] Exceptions

The overload with a template parameter named ExecutionPolicy reports errors as follows:

[edit] Possible implementation

See also the implementations in libstdc++, libc++, and MSVC STL.

template constexpr // since C++20 void reverse(BidirIt first, BidirIt last) { using iter_cat = typename std::iterator_traits::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); }

[edit] 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.

[edit] Example

#include #include #include #include   void println(auto rem, auto const& v) { for (std::cout << rem; auto e : v) std::cout << e << ' '; std::cout << '\n'; }   int main() { std::vector 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

[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 223 C++98 std::swap was applied to each pair of iterators applies std::iter_swap instead
LWG 2039 C++98 std::iter_swap was also applied when iequals std::distance(first, last) / 2 not applied

[edit] See also