STD::REVERSE_ITERATOR(3cxx)
π NAME π
std::reverse_iterator< _Iterator > β bestie, this is the 3cxx manual page for libstdc++'s reverse iterator adaptor, and it is iconic but also lowkey spicy. π¦
β¨ SYNOPSIS β¨
#include <iterator>
Inherits std::iterator< iterator_traits< _Iterator >::iterator_category, iterator_traits< _Iterator >::value_type, iterator_traits< _Iterator >::difference_type, iterator_traits< _Iterator >::pointer, iterator_traits< _Iterator >::reference >.
πΈ Public Types πΈ
using difference_type = iter_difference_t< _Iterator >using iterator_category = __detail::__clamp_iter_cat< typename __traits_type::iterator_category, random_access_iterator_tag >using iterator_concept = __conditional_t< random_access_iterator< _Iterator >, random_access_iterator_tag, bidirectional_iterator_tag >typedef _Iterator iterator_typetypedef __traits_type::pointer pointerusing reference = iter_reference_t< _Iterator >using value_type = iter_value_t< _Iterator >
π Public Member Functions π
constexpr reverse_iterator () noexcept(/*conditional */)constexpr reverse_iterator (const reverse_iterator &__x) noexcept(/*conditional */)template<typename _Iter > requires __convertible<_Iter>constexpr reverse_iterator (const reverse_iterator< _Iter > &__x) noexcept(/*conditional */)"constexpr reverse_iterator (iterator_type __x) noexcept(/*conditional */)constexpr iterator_type base () const noexcept(/*conditional */)constexpr reference operator* () constconstexpr reverse_iterator operator+ (difference_type __n) constconstexpr reverse_iterator & operator++ ()constexpr reverse_iterator operator++ (int)constexpr reverse_iterator & operator+= (difference_type __n)constexpr reverse_iterator operator- (difference_type __n) constconstexpr reverse_iterator & operator-- ()constexpr reverse_iterator operator-- (int)constexpr reverse_iterator & operator-= (difference_type __n)constexpr pointer operator-> () constreverse_iterator & operator= (const reverse_iterator &)=defaulttemplate<typename _Iter > requires __convertible<_Iter> && assignable_from<_Iterator&, const _Iter&>constexpr reverse_iterator & operator= (const reverse_iterator< _Iter > &__x) noexcept(/*conditional */)"constexpr reference operator[] (difference_type __n) const
π§ Protected Types π§
typedef iterator_traits< _Iterator > __traits_type
π Protected Attributes π
_Iterator current
π«Ά Friends π«Ά
constexpr iter_rvalue_reference_t< _Iterator > iter_move (const reverse_iterator &__i) noexcept(is_nothrow_copy_constructible_v< _Iterator > &&noexcept(ranges::iter_move(--std::declval< _Iterator & >())))template<indirectly_swappable< _Iterator > _Iter2> constexpr void iter_swap (const reverse_iterator &__x, const reverse_iterator< _Iter2 > &__y) noexcept(is_nothrow_copy_constructible_v< _Iterator > &&is_nothrow_copy_constructible_v< _Iter2 > &&noexcept(ranges::iter_swap(--std::declval< _Iterator & >(), --std::declval< _Iter2 & >())))
π Detailed Description π
Okay so the template is:
template<typename _Iterator>
class std::reverse_iterator< _Iterator >
And yes, the original page literally glues that class line to the next word with a quote: class std::reverse_iterator< _Iterator >"Bidirectional β artifacts stay, bestie. π
So here's the tea: bidirectional and random access iterators have corresponding reverse iterator adaptors that walk through the data structure in the opposite direction. They have the same signatures as the corresponding iterators.
The fundamental relation between a reverse iterator and its corresponding iterator i is established by the identity:
&*(reverse_iterator(i)) == &*(i - 1)
This mapping is dictated by the fact that while there is always a pointer past the end of an array, there might not be a valid pointer before the beginning of an array. [24.4.1]/1,2
Reverse iterators can be tricky and surprising at first. Their semantics make sense, however, and the trickiness is a side effect of the requirement that the iterators must be safe. Periodt. β¨
π Constructor & Destructor Documentation π
template<typename _Iterator > constexpr std::reverse_iterator< _Iterator >::reverse_iterator () [inline], [constexpr], [noexcept]β The default constructor value-initializes membercurrent. If it is a pointer, that means it is zero-initialized.template<typename _Iterator > constexpr std::reverse_iterator< _Iterator >::reverse_iterator (iterator_type __x) [inline], [explicit], [constexpr], [noexcept]β This iterator will move in the opposite direction thatxdoes.template<typename _Iterator > constexpr std::reverse_iterator< _Iterator >::reverse_iterator (const reverse_iterator< _Iterator > & __x) [inline], [constexpr], [noexcept]β The copy constructor is normal.template<typename _Iterator > template<typename _Iter > requires __convertible<_Iter>constexpr std::reverse_iterator< _Iterator >::reverse_iterator (const reverse_iterator< _Iter > & __x) [inline], [constexpr], [noexcept]"β Areverse_iteratoracross other types can be copied if the underlying iterator can be converted to the type ofcurrent.
πΈ Member Function Documentation πΈ
template<typename _Iterator > constexpr iterator_type std::reverse_iterator< _Iterator >::base () const [inline], [constexpr], [noexcept]β Returnscurrent, the iterator used for underlying work. Referenced bystd::operator==().template<typename _Iterator > constexpr reference std::reverse_iterator< _Iterator >::operator* () const [inline], [constexpr]β Returns a reference to the value at--current. This requires that--currentis dereferenceable.
Warning: This implementation requires that for an iterator of the underlying iterator type,x, a reference obtained by*xremains valid afterxhas been modified or destroyed. This is a bug:http://gcc.gnu.org/PR51823
template<typename _Iterator > constexpr reverse_iterator std::reverse_iterator< _Iterator >::operator+ (difference_type __n) const [inline], [constexpr]β Returns areverse_iteratorthat refers tocurrent - __n. The underlying iterator must be a Random Access Iterator.template<typename _Iterator > constexpr reverse_iterator & std::reverse_iterator< _Iterator >::operator++ () [inline], [constexpr]β Returns*this. Decrements the underlying iterator.template<typename _Iterator > constexpr reverse_iterator std::reverse_iterator< _Iterator >::operator++ (int) [inline], [constexpr]β Returns the original value of*this. Decrements the underlying iterator.template<typename _Iterator > constexpr reverse_iterator & std::reverse_iterator< _Iterator >::operator+= (difference_type __n) [inline], [constexpr]β Returns*this. Moves the underlying iterator backwards__nsteps. The underlying iterator must be a Random Access Iterator.template<typename _Iterator > constexpr reverse_iterator std::reverse_iterator< _Iterator >::operator- (difference_type __n) const [inline], [constexpr]β Returns areverse_iteratorthat refers tocurrent - __n. The underlying iterator must be a Random Access Iterator.template<typename _Iterator > constexpr reverse_iterator & std::reverse_iterator< _Iterator >::operator-- () [inline], [constexpr]β Returns*this. Increments the underlying iterator.template<typename _Iterator > constexpr reverse_iterator std::reverse_iterator< _Iterator >::operator-- (int) [inline], [constexpr]β Returns areverse_iteratorwith the previous value of*this. Increments the underlying iterator.template<typename _Iterator > constexpr reverse_iterator & std::reverse_iterator< _Iterator >::operator-= (difference_type __n) [inline], [constexpr]β Returns*this. Moves the underlying iterator forwards__nsteps. The underlying iterator must be a Random Access Iterator.template<typename _Iterator > constexpr pointer std::reverse_iterator< _Iterator >::operator-> () const [inline], [constexpr]β Returns a pointer to the value at--current. This requires that--currentis dereferenceable.template<typename _Iterator > constexpr reference std::reverse_iterator< _Iterator >::operator[] (difference_type __n) const [inline], [constexpr]β Returns the value atcurrent - __n - 1. The underlying iterator must be a Random Access Iterator.
π Author π
Generated automatically by Doxygen for libstdc++ from the source code.
Source/version: libstdc++, generated automatically by Doxygen from the source code. Manual: 3cxx. Date: the footer doesn't actually show one, so I'm not inventing one β no cap. Stay safe and dereference responsibly, bestie ππ«Άπ
π¦ where this page comes from
- ubuntu noble: libstdc++-14-doc 14-20240412-0ubuntu1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms