Namespaces
Variants
Actions

std::reverse_iterator

From cppreference.com
< cpp‎ | iterator
 
 
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
Defined in header <iterator>
template<class Iter >
class reverse_iterator;

std::reverse_iterator is an iterator adaptor that reverses the direction of a given iterator, which must be at least a LegacyBidirectionalIterator or model bidirectional_iterator(since C++20). In other words, when provided with a bidirectional iterator, std::reverse_iterator produces a new iterator that moves from the end to the beginning of the sequence defined by the underlying bidirectional iterator.

For a reverse iterator r constructed from an iterator i, the relationship &*r ==&*(i -1) is always true (as long as r is dereferenceable); thus a reverse iterator constructed from a one-past-the-end iterator dereferences to the last element in a sequence.

This is the iterator returned by member functions rbegin() and rend() of the standard library containers.

range-rbegin-rend.svg

Contents

[edit]Nested types

Type Definition
iterator_typeIter
iterator_categorystd::iterator_traits<Iter>::iterator_category[1]
value_typestd::iterator_traits<Iter>::value_type[1]
difference_typestd::iterator_traits<Iter>::difference_type
pointerstd::iterator_traits<Iter>::pointer
referencestd::iterator_traits<Iter>::reference
(until C++20)
Type Definition
iterator_typeIter
iterator_concept
iterator_category
value_typestd::iter_value_t<Iter>
difference_typestd::iter_difference_t<Iter>
pointerstd::iterator_traits<Iter>::pointer
referencestd::iter_reference_t<Iter>
(since C++20)
  1. 1.01.1The definition is provided by the base std::iterator specialization until C++17.

[edit]Data members

Member Description
Itercurrent the underlying iterator
(protected member object)

[edit]Member functions

constructs a new reverse_iterator
(public member function)[edit]
assigns another reverse_iterator
(public member function)[edit]
accesses the underlying iterator
(public member function)[edit]
accesses the pointed-to element
(public member function)[edit]
accesses an element by index
(public member function)[edit]
advances or decrements the reverse_iterator
(public member function)[edit]

[edit]Non-member functions

compares the underlying iterators
(function template)[edit]
advances the iterator
(function template)[edit]
computes the distance between two iterator adaptors
(function template)[edit]
(C++20)
casts the result of dereferencing the adjusted underlying iterator to its associated rvalue reference type
(function)[edit]
(C++20)
swaps the objects pointed to by two adjusted underlying iterators
(function template)[edit]
creates a std::reverse_iterator of type inferred from the argument
(function template)[edit]

[edit]Helper templates

template<class Iterator1, class Iterator2 >

    requires (!std::sized_sentinel_for<Iterator1, Iterator2>)
inlineconstexprbool disable_sized_sentinel_for

    <std::reverse_iterator<Iterator1>, std::reverse_iterator<Iterator2>>=true;
(since C++20)

This partial specialization of std::disable_sized_sentinel_for prevents specializations of reverse_iterator from satisfying sized_sentinel_for if their underlying iterators do not satisfy the concept.

[edit]Possible implementation

Below is a partial implementation focusing on the way the inner iterator is stored, calling std::prev only when the content is fetched via operator*.

template<class It>class reverse_iterator {protected: It current = It();public: reverse_iterator()=default;constexprexplicit reverse_iterator(It itr): current(itr){}template<class U> requires (!std::is_same_v<U, It>&&std::convertible_to<const U&, It>)constexprexplicit reverse_iterator(const U& other): current(other.base()){}   constexpr decltype(auto) operator*()const{return*std::prev(current);// <== returns the content of prev}   constexpr reverse_iterator& operator++(){--current;return*this;}constexpr reverse_iterator operator++(int){auto tmp =*this;++(*this);return tmp;}   constexpr reverse_iterator& operator--(){++current;return*this;}constexpr reverse_iterator operator--(int){auto tmp =*this;--(*this);return tmp;}   constexpr It base()const{return current;}   // Other member functions, friend functions, and member typedefs are not shown here.};

[edit]Notes

std::reverse_iterator does not work with iterators whose dereference returns a reference to a member of *this (so-called “stashing iterators”). An example of a stashing iterator is MSVC STL'sstd::filesystem::path::iterator.

[edit]Example

#include <cstddef>#include <iostream>#include <iterator>   template<typename T, std::size_t SIZE>class Stack { T arr[SIZE];std::size_t pos =0;public: T pop(){return arr[--pos];}   Stack& push(const T& t){ arr[pos++]= t;return*this;}   // we wish that looping on Stack would be in LIFO order// thus we use std::reverse_iterator as an adaptor to existing iterators// (which are in this case the simple pointers: [arr, arr + pos)auto begin(){return std::reverse_iterator(arr + pos);}auto end(){return std::reverse_iterator(arr);}};   int main(){ Stack<int, 8> s; s.push(5).push(15).push(25).push(35);for(int val : s)std::cout<< val <<' ';std::cout<<'\n';}

Output:

35 25 15 5

[edit]See also

creates a std::reverse_iterator of type inferred from the argument
(function template)[edit]
(deprecated in C++17)
base class to ease the definition of required types for simple iterators
(class template)[edit]
close