Files
cppdraft_translate/cppdraft/reverse/iterators.md
2025-10-25 03:02:53 +03:00

21 KiB
Raw Blame History

[reverse.iterators]

24 Iterators library [iterators]

24.5 Iterator adaptors [predef.iterators]

24.5.1 Reverse iterators [reverse.iterators]

24.5.1.1 General [reverse.iterators.general]

1

#

Class template reverse_iterator is an iterator adaptor that iterates from the end of the sequence defined by its underlying iterator to the beginning of that sequence.

24.5.1.2 Class template reverse_iterator [reverse.iterator]

🔗

namespace std {templateclass reverse_iterator {public:using iterator_type = Iterator; using iterator_concept = see below; using iterator_category = see below; using value_type = iter_value_t; using difference_type = iter_difference_t; using pointer = typename iterator_traits::pointer; using reference = iter_reference_t; constexpr reverse_iterator(); constexpr explicit reverse_iterator(Iterator x); template constexpr reverse_iterator(const reverse_iterator& u); template constexpr reverse_iterator& operator=(const reverse_iterator& u); constexpr Iterator base() const; constexpr reference operator*() const; constexpr pointer operator->() const requires see below; 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; friend constexpr iter_rvalue_reference_t iter_move(const reverse_iterator& i) noexcept(see below); template<indirectly_swappable Iterator2>friend constexpr void iter_swap(const reverse_iterator& x, const reverse_iterator& y) noexcept(see below); protected: Iterator current; };}

1

#

The member typedef-name iterator_concept denotes

random_access_iterator_tag if Iterator modelsrandom_access_iterator, and

bidirectional_iterator_tag otherwise.

2

#

The member typedef-name iterator_category denotes

random_access_iterator_tag if the typeiterator_traits<Iterator>::iterator_category modelsderived_from<random_access_iterator_tag>, and

iterator_traits<Iterator>::iterator_category otherwise.

24.5.1.3 Requirements [reverse.iter.requirements]

1

#

The template parameterIterator shall either meet the requirements of aCpp17BidirectionalIterator ([bidirectional.iterators]) or modelbidirectional_iterator ([iterator.concept.bidir]).

2

#

Additionally,Iterator shall either meet the requirements of aCpp17RandomAccessIterator ([random.access.iterators]) or modelrandom_access_iterator ([iterator.concept.random.access]) if the definitions of any of the members

operator+,operator-,operator+=,operator-= ([reverse.iter.nav]), or

operator[] ([reverse.iter.elem]),

or the non-member operators ([reverse.iter.cmp])

operator<,operator>,operator<=,operator>=,operator-, oroperator+ ([reverse.iter.nonmember])

are instantiated ([temp.inst]).

24.5.1.4 Construction and assignment [reverse.iter.cons]

🔗

constexpr reverse_iterator();

1

#

Effects: Value-initializescurrent.

🔗

constexpr explicit reverse_iterator(Iterator x);

2

#

Effects: Initializescurrent with x.

🔗

template<class U> constexpr reverse_iterator(const reverse_iterator<U>& u);

3

#

Constraints: is_same_v<U, Iterator> is false andconst U& models convertible_to.

4

#

Effects: Initializescurrent withu.current.

🔗

template<class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);

5

#

Constraints: is_same_v<U, Iterator> is false,const U& models convertible_to, andassignable_from<Iterator&, const U&> is modeled.

6

#

Effects: Assigns u.current to current.

7

#

Returns: *this.

24.5.1.5 Conversion [reverse.iter.conv]

🔗

constexpr Iterator base() const;

1

#

Returns: current.

24.5.1.6 Element access [reverse.iter.elem]

🔗

constexpr reference operator*() const;

1

#

Effects: As if by:Iterator tmp = current;return *--tmp;

🔗

constexpr pointer operator->() const requires (is_pointer_v<Iterator> || requires(const Iterator i) { i.operator->(); });

2

#

Effects:

If Iterator is a pointer type, equivalent to:return prev(current);

Otherwise, equivalent to:return prev(current).operator->();

🔗

constexpr unspecified operator[](difference_type n) const;

3

#

Returns: current[-n - 1].

24.5.1.7 Navigation [reverse.iter.nav]

🔗

constexpr reverse_iterator operator+(difference_type n) const;

1

#

Returns: reverse_iterator(current - n).

🔗

constexpr reverse_iterator operator-(difference_type n) const;

2

#

Returns: reverse_iterator(current + n).

🔗

constexpr reverse_iterator& operator++();

3

#

Effects: As if by: --current;

4

#

Returns: *this.

🔗

constexpr reverse_iterator operator++(int);

5

#

Effects: As if by:reverse_iterator tmp = *this;--current;return tmp;

🔗

constexpr reverse_iterator& operator--();

6

#

Effects: As if by ++current.

7

#

Returns: *this.

🔗

constexpr reverse_iterator operator--(int);

8

#

Effects: As if by:reverse_iterator tmp = *this;++current;return tmp;

🔗

constexpr reverse_iterator& operator+=(difference_type n);

9

#

Effects: As if by: current -= n;

10

#

Returns: *this.

🔗

constexpr reverse_iterator& operator-=(difference_type n);

11

#

Effects: As if by: current += n;

12

#

Returns: *this.

24.5.1.8 Comparisons [reverse.iter.cmp]

🔗

template<class Iterator1, class Iterator2> constexpr bool operator==( const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);

1

#

Constraints: x.base() == y.base() is well-formed and convertible to bool.

2

#

Returns: x.base() == y.base().

🔗

template<class Iterator1, class Iterator2> constexpr bool operator!=( const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);

3

#

Constraints: x.base() != y.base() is well-formed and convertible to bool.

4

#

Returns: x.base() != y.base().

🔗

template<class Iterator1, class Iterator2> constexpr bool operator<( const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);

5

#

Constraints: x.base() > y.base() is well-formed and convertible to bool.

6

#

Returns: x.base() > y.base().

🔗

template<class Iterator1, class Iterator2> constexpr bool operator>( const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);

7

#

Constraints: x.base() < y.base() is well-formed and convertible to bool.

8

#

Returns: x.base() < y.base().

🔗

template<class Iterator1, class Iterator2> constexpr bool operator<=( const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);

9

#

Constraints: x.base() >= y.base() is well-formed and convertible to bool.

10

#

Returns: x.base() >= y.base().

🔗

template<class Iterator1, class Iterator2> constexpr bool operator>=( const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);

11

#

Constraints: x.base() <= y.base() is well-formed and convertible to bool.

12

#

Returns: x.base() <= y.base().

🔗

template<class Iterator1, [three_way_comparable_with](cmp.concept#concept:three_way_comparable_with "17.12.4Concept three_­way_­comparable[cmp.concept]")<Iterator1> Iterator2> constexpr compare_three_way_result_t<Iterator1, Iterator2> operator<=>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);

13

#

Returns: y.base() <=> x.base().

14

#

[Note 1:

The argument order in the Returns: element is reversed because this is a reverse iterator.

— end note]

24.5.1.9 Non-member functions [reverse.iter.nonmember]

🔗

template<class Iterator1, class Iterator2> constexpr auto operator-( const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());

1

#

Returns: y.base() - x.base().

🔗

template<class Iterator> constexpr reverse_iterator<Iterator> operator+( iter_difference_t<Iterator> n, const reverse_iterator<Iterator>& x);

2

#

Returns: reverse_iterator(x.base() - n).

🔗

friend constexpr iter_rvalue_reference_t<Iterator> iter_move(const reverse_iterator& i) noexcept(see below);

3

#

Effects: Equivalent to:auto tmp = i.base();return ranges::iter_move(--tmp);

4

#

Remarks: The exception specification is equivalent to:is_nothrow_copy_constructible_v &&noexcept(ranges::iter_move(--declval<Iterator&>()))

🔗

template<[indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4Concept indirectly_­swappable[alg.req.ind.swap]")<Iterator> Iterator2> friend constexpr void iter_swap(const reverse_iterator& x, const reverse_iterator<Iterator2>& y) noexcept(see below);

5

#

Effects: Equivalent to:auto xtmp = x.base();auto ytmp = y.base(); ranges::iter_swap(--xtmp, --ytmp);

6

#

Remarks: The exception specification is equivalent to:is_nothrow_copy_constructible_v && is_nothrow_copy_constructible_v &&noexcept(ranges::iter_swap(--declval<Iterator&>(), --declval<Iterator2&>()))

🔗

template<class Iterator> constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i);

7

#

Returns: reverse_iterator(i).