The Wayback Machine - https://web.archive.org/web/20190830134737/https://en.cppreference.com/w/cpp/algorithm/reverse
Namespaces
Variants
Actions

std::reverse

From cppreference.com
< cpp‎ | algorithm
 
 
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Concepts and utilities: std::Sortable, std::projected, ...
Constrained algorithms: std::ranges::copy, std::ranges::sort, ...
Execution policies (C++17)
Non-modifying sequence operations
(C++11)(C++11)(C++11)
(C++17)
Modifying sequence operations
Operations on uninitialized storage
Partitioning operations
Sorting operations
Binary search operations
Set operations (on sorted ranges)
Heap operations
(C++11)
Minimum/maximum operations
(C++11)
(C++17)
Permutations
Numeric operations
C library
 
Defined in header <algorithm>
(1)
template<class BidirIt >
void reverse( BidirIt first, BidirIt last );
(until C++20)
template<class BidirIt >
constexprvoid reverse( BidirIt first, BidirIt last );
(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, (last-i) - 1 for each non-negative i < (last-first)/2
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

Contents

[edit]Parameters

first, last - the range of elements to reverse
policy - the execution policy to use. See execution policy for details.
Type requirements
-
BidirIt must meet the requirements of ValueSwappable and LegacyBidirectionalIterator.

[edit]Return value

(none)

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

[edit]Possible implementation

See also the implementations in libstdc++ and libc++.

template<class BidirIt>void reverse(BidirIt first, BidirIt last){while((first != last)&&(first !=--last)){std::iter_swap(first++, last);}}

[edit]Complexity

Exactly (last - first)/2 swaps.

[edit]Example

#include <vector>#include <iostream>#include <iterator>#include <algorithm>   int main(){std::vector<int> v{1,2,3}; std::reverse(std::begin(v), std::end(v));for(auto e : v)std::cout<< e;std::cout<<'\n';   int a[]={4, 5, 6, 7}; std::reverse(std::begin(a), std::end(a));for(auto e : a)std::cout<< e;}

Output:

321 7654


[edit]See also

creates a copy of a range that is reversed
(function template)[edit]
close