Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::reverse(3)		      C++ Standard Libary	       std::reverse(3)

NAME
       std::reverse - std::reverse

Synopsis
	  Defined in header <algorithm>
	  template<		   class	       BidirIt		     >
       (until C++20)
	  void reverse(	BidirIt	first, BidirIt last );
	  template<		  class		      BidirIt		     >
       (since C++20)
	  constexpr void reverse( BidirIt first, BidirIt last );	 (1)
	  template< class ExecutionPolicy, class BidirIt >
	  void	reverse(  ExecutionPolicy&&  policy,  BidirIt  first,  BidirIt
       (2) (since C++17)
	  last );

	  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>>
	  (until C++20)
	  std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>
	  (since C++20)	is true.

Parameters
	  first, last	 -    the range	of elements to reverse
	  policy	  -    the execution policy to use. See	execution pol-
       icy for details.

Type requirements
	  -
	  BidirIt must meet the	requirements of	ValueSwappable and
	  LegacyBidirectionalIterator.

Return value
	  (none)

Complexity
	  Exactly (last	- first)/2 swaps.

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::termi-
       nate is called.
	      For  any	other ExecutionPolicy, the behavior is implementation-
       defined.
	    * If the algorithm fails to	 allocate  memory,  std::bad_alloc  is
       thrown.

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.

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>::itera-
       tor_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);
		  }
	      }
	  }

Example
       // Run this code

	#include <vector>
	#include <iostream>
	#include <iterator>
	#include <algorithm>

	int main()
	{
	    std::vector<int> v{1, 2, 3};
	    std::reverse(v.begin(), v.end());
	    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

See also
	  reverse_copy	  creates a copy of a range that is reversed
			  (function template)
	  ranges::reverse reverses the order of	elements in a range
	  (C++20)	  (niebloid)

http://cppreference.com		  2022.07.31		       std::reverse(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::reverse&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help