namespace std {
template <class Iterator>
class reverse_iterator {
public:
using iterator_type = Iterator;
using iterator_category = typename iterator_traits<Iterator>::iterator_category;
using value_type = typename iterator_traits<Iterator>::value_type;
using difference_type = typename iterator_traits<Iterator>::difference_type;
using pointer = typename iterator_traits<Iterator>::pointer;
using reference = typename iterator_traits<Iterator>::reference;
constexpr reverse_iterator();
constexpr explicit reverse_iterator(Iterator x);
template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
template <class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);
constexpr Iterator base() const; constexpr reference operator*() const;
constexpr pointer operator->() const;
constexpr reverse_iterator& operator++();
constexpr reverse_iterator operator++(int);
constexpr reverse_iterator& operator--();
constexpr reverse_iterator operator--(int);
constexpr reverse_iterator operator+ (difference_type n) const;
constexpr reverse_iterator& operator+=(difference_type n);
constexpr reverse_iterator operator- (difference_type n) const;
constexpr reverse_iterator& operator-=(difference_type n);
constexpr unspecified operator[](difference_type n) const;
protected:
Iterator current;
};
template <class Iterator1, class Iterator2>
constexpr bool operator==(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
template <class Iterator1, class Iterator2>
constexpr bool operator<(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
template <class Iterator1, class Iterator2>
constexpr bool operator!=(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
template <class Iterator1, class Iterator2>
constexpr bool operator>(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
template <class Iterator1, class Iterator2>
constexpr bool operator>=(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
template <class Iterator1, class Iterator2>
constexpr bool operator<=(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
template <class Iterator1, class Iterator2>
constexpr auto operator-(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
template <class Iterator>
constexpr reverse_iterator<Iterator> operator+(
typename reverse_iterator<Iterator>::difference_type n,
const reverse_iterator<Iterator>& x);
template <class Iterator>
constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
}
constexpr reverse_iterator();
Effects:
Value-initializes
current. Iterator operations applied to the resulting iterator have defined behavior
if and only if the corresponding operations are defined on a value-initialized iterator of type
Iterator.constexpr explicit reverse_iterator(Iterator x);
Effects:
Initializes
current
with
x. template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
Effects:
Initializes
current
with
u.current. template <class U>
constexpr reverse_iterator&
operator=(const reverse_iterator<U>& u);
Effects:
Assigns
u.base() to current
. constexpr Iterator base() const;
constexpr reference operator*() const;
Effects:
As if by:
Iterator tmp = current;
return *--tmp;
constexpr pointer operator->() const;
Returns: addressof(operator*()). constexpr reverse_iterator& operator++();
Effects:
As if by: --current;
constexpr reverse_iterator operator++(int);
Effects:
As if by:
reverse_iterator tmp = *this;
--current;
return tmp;
constexpr reverse_iterator& operator--();
Effects:
As if by
++current. constexpr reverse_iterator operator--(int);
Effects:
As if by:
reverse_iterator tmp = *this;
++current;
return tmp;
constexpr reverse_iterator operator+(difference_type n) const;
Returns:
reverse_iterator(current-n). constexpr reverse_iterator& operator+=(difference_type n);
Effects:
As if by: current -= n;
constexpr reverse_iterator operator-(difference_type n) const;
Returns:
reverse_iterator(current+n). constexpr reverse_iterator& operator-=(difference_type n);
Effects:
As if by: current += n;
constexpr unspecified operator[](difference_type n) const;
template <class Iterator1, class Iterator2>
constexpr bool operator==(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
Returns:
x.current == y.current. template <class Iterator1, class Iterator2>
constexpr bool operator<(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
Returns:
x.current > y.current. template <class Iterator1, class Iterator2>
constexpr bool operator!=(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
Returns:
x.current != y.current. template <class Iterator1, class Iterator2>
constexpr bool operator>(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
Returns:
x.current < y.current. template <class Iterator1, class Iterator2>
constexpr bool operator>=(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
Returns:
x.current <= y.current. template <class Iterator1, class Iterator2>
constexpr bool operator<=(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
Returns:
x.current >= y.current. template <class Iterator1, class Iterator2>
constexpr auto operator-(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
Returns:
y.current - x.current. template <class Iterator>
constexpr reverse_iterator<Iterator> operator+(
typename reverse_iterator<Iterator>::difference_type n,
const reverse_iterator<Iterator>& x);
Returns:
reverse_iterator<Iterator> (x.current - n). template <class Iterator>
constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
Returns:
reverse_iterator<Iterator>(i).