std::ranges::iota_view<W, Bound>::iterator - cppreference.com (original) (raw)
| struct /*iterator*/; | (1) | (exposition only*) |
|---|---|---|
| Helper alias templates | ||
| template< class I > using /*iota-diff-t*/ = /* see below */; | (2) | (exposition only*) |
| Helper concepts | ||
| template< class I > concept /*decrementable*/ = std::incrementable<I> && requires(I i) { { --i } -> std::same_as<I&>; { i-- } -> std::same_as<I>; }; | (3) | (exposition only*) |
| template< class I > concept /*advanceable*/ = /*decrementable*/<I> && std::totally_ordered<I> && requires(I i, const I j, const /*iota-diff-t*/<I> n) { { i += n } -> std::same_as<I&>; { i -= n } -> std::same_as<I&>; I(j + n); I(n + j); I(j - n); { j - j } -> std::convertible_to</*iota-diff-t*/<I>>; }; | (4) | (exposition only*) |
- Calculates the difference type for both iterator types and integer-like types.
- If
Iis not an integral type, or if it is an integral type and sizeof(std::iter_difference_t<I>) is greater than sizeof(I), then /*iota-diff-t*/<I> is std::iter_difference_t<I>. - Otherwise, /*iota-diff-t*/<I> is a signed integer type of width greater than the width of
Iif such a type exists. - Otherwise,
Iis one of the widest integral types, and /*iota-diff-t*/<I> is an unspecified signed-integer-like type of width not less than the width ofI. It is unspecified whether /*iota-diff-t*/<I> models weakly_incrementable in this case.
Specifies that a type is incrementable, and pre- and post- operator-- for the type have common meaning.
Specifies that a type is both
_[decrementable](iterator.html#decrementable)_and totally_ordered, and operator+=, operator-=, operator+, and operator- among the type and its different type have common meaning.
/*iterator*/ models
- random_access_iterator if W models
_[advanceable](iterator.html#advanceable)_(4), - bidirectional_iterator if W models
_[decrementable](iterator.html#decrementable)_(3), - forward_iterator if W models incrementable, and
- input_iterator otherwise.
However, it only satisfies LegacyInputIterator if W models incrementable, and does not satisfy LegacyInputIterator otherwise.
Contents
- 1 Semantic requirements
- 2 Nested types
- 3 Data members
- 4 Member functions
- 5 std::ranges::iota_view::iterator::iterator
- 6 std::ranges::iota_view::iterator::operator*
- 7 std::ranges::iota_view::iterator::operator++
- 8 std::ranges::iota_view::iterator::operator--
- 9 std::ranges::iota_view::iterator::operator+=
- 10 std::ranges::iota_view::iterator::operator-=
- 11 std::ranges::iota_view::iterator::operator[]
- 12 operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)
- 13 operator+(std::ranges::iota_view::iterator)
- 14 operator-(std::ranges::iota_view::iterator)
[edit] Semantic requirements
- Type
Imodels_decrementable_only ifIsatisfies_decrementable_and all concepts it subsumes are modeled, and given equal objects a and b of typeI:
- If a and b are in the domain of both pre- and post- operator-- (i.e. they are decrementable), then the following are all true:
- std::addressof(--a) == std::addressof(a),
- bool(a-- == b),
- bool(((void)a--, a) == --b),
- bool(++(--a) == b).
- If a and b are in the domain of both pre- and post- operator++ (i.e. they are incrementable), then bool(--(++a) == b) is true.
- Let
Ddenote /*iota-diff-t*/<I>. TypeImodels_[advanceable](iterator.html#advanceable)_only ifIsatisfies_[advanceable](iterator.html#advanceable)_and all concepts it subsumes are modeled, and given
- objects a and b of type
Iand - value n of type
D,
such that b is reachable from a after n applications of ++a, all following conditions are satisfied:
- (a += n) is equal to b.
- std::addressof(a += n) is equal to std::addressof(a).
- I(a + n) is equal to (a += n).
- For any two positive values x and y of type
D, if I(a + D(x + y)) is well-defined, then I(a + D(x + y)) is equal to I(I(a + x) + y). - I(a + D(0)) is equal to a.
- If I(a + D(n - 1)) is well-defined, then I(a + n) is equal to [](I c) { return ++c; }(I(a + D(n - 1))).
- (b += -n) is equal to a.
- (b -= n) is equal to a.
- std::addressof(b -= n) is equal to std::addressof(b).
- I(b - n) is equal to (b -= n).
- D(b - a) is equal to n.
- D(a - b) is equal to D(-n).
- bool(a <= b) is true.
[edit] Nested types
[edit] Determining the iterator concept
iterator_concept is defined as follows:
- If
Wmodels_[advanceable](iterator.html#advanceable)_,iterator_conceptdenotes std::random_access_iterator_tag. - Otherwise, if
Wmodels_[decrementable](iterator.html#decrementable)_,iterator_conceptdenotes std::bidirectional_iterator_tag. - Otherwise, if
Wmodels incrementable,iterator_conceptdenotes std::forward_iterator_tag. - Otherwise,
iterator_conceptdenotes std::input_iterator_tag.
[edit] Data members
| Member | Definition |
|---|---|
| W value_ | the current value(exposition-only member object*) |
[edit] Member functions
std::ranges::iota_view::iterator::iterator
| | (1) | (since C++20) | | | --------------------------------------------- | ------------- | ------------- | | constexpr explicit /*iterator*/( W value ); | (2) | (since C++20) |
Value initializes
_[value](iterator.html#value)_.Initializes
_[value](iterator.html#value)_with value.
std::ranges::iota_view::iterator::operator*
Returns _[value](iterator.html#value)_.
Example
#include #include int main() { auto it{std::views::iota(6, 9).begin()}; const int& r = *it; // binds with temporary assert(*it == 6 and r == 6); ++it; assert(*it == 7 and r == 6); }
std::ranges::iota_view::iterator::operator++
| constexpr /*iterator*/& operator++(); | (1) | (since C++20) |
|---|---|---|
| constexpr void operator++(int); | (2) | (since C++20) |
| constexpr /*iterator*/ operator++(int) requires std::incrementable<W>; | (3) | (since C++20) |
Equivalent to ++
_[value](iterator.html#value)_; return *this;.Equivalent to ++
_[value](iterator.html#value)_;.Equivalent to auto tmp = *this; ++
_[value](iterator.html#value)_; return tmp;.
Example
std::ranges::iota_view::iterator::operator--
| constexpr /*iterator*/& operator--() requires /*decrementable*/<W>; | (1) | (since C++20) |
|---|---|---|
| constexpr /*iterator*/operator--(int) requires /*decrementable*/<W>; | (2) | (since C++20) |
Equivalent to --
_[value](iterator.html#value)_; return *this;.Equivalent to auto tmp = *this; --
_[value](iterator.html#value)_; return tmp;.
Example
std::ranges::iota_view::iterator::operator+=
| constexpr /*iterator*/& operator+=( difference_type n ) requires /*advanceable*/<W>; | | (since C++20) | | ------------------------------------------------------------------------------------------- | | ------------- |
Updates _[value](iterator.html#value)_ and returns *this:
- If
Wis an unsigned-integer-like type:- If n is non-negative, performs
_[value](iterator.html#value)_+= static_cast<W>(n). - Otherwise, performs
_[value](iterator.html#value)_-= static_cast<W>(-n).
- If n is non-negative, performs
- Otherwise, performs
_[value](iterator.html#value)_+= n.
Example
#include #include int main() { auto it{std::views::iota(5).begin()}; assert(it == 5); assert((it += 3) == 8); }
std::ranges::iota_view::iterator::operator-=
| constexpr /*iterator*/& operator-=( difference_type n ) requires /*advanceable*/<W>; | | (since C++20) | | -------------------------------------------------------------------------------------------- | | ------------- |
Updates _[value](iterator.html#value)_ and returns *this:
- If
Wis an unsigned-integer-like type:- If n is non-negative, performs
_[value](iterator.html#value)_-= static_cast<W>(n). - Otherwise, performs
_[value](iterator.html#value)_+= static_cast<W>(-n).
- If n is non-negative, performs
- Otherwise, performs
_[value](iterator.html#value)_-= n.
Example
#include #include int main() { auto it{std::views::iota(6).begin()}; assert(it == 6); assert((it -= -3) == 9); }
std::ranges::iota_view::iterator::operator[]
| constexpr W operator[]( difference_type n ) const requires /*advanceable*/<W>; | | (since C++20) | | ------------------------------------------------------------------------------------ | | ------------- |
Returns W(_[value](iterator.html#value)_ + n).
Example
#include #include int main() { auto it{std::views::iota(6).begin()}; assert(it == 6); assert((it + 3) == 9); }
[edit] Non-member functions
operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)
| friend constexpr bool operator== ( const /*iterator*/& x, const /*iterator*/& y ) requires std::equality_comparable<W>; | (1) | (since C++20) |
|---|---|---|
| friend constexpr bool operator< ( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W>; | (2) | (since C++20) |
| friend constexpr bool operator> ( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W>; | (3) | (since C++20) |
| friend constexpr bool operator<= ( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W>; | (4) | (since C++20) |
| friend constexpr bool operator>= ( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W>; | (5) | (since C++20) |
| friend constexpr bool operator<=> ( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W> && std::three_way_comparable<W>; | (6) | (since C++20) |
Returns y < x.
Returns !(y < x).
Returns !(x < y).
The != operator is synthesized from operator==.
These functions are not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when iterator is an associated class of the arguments.
operator+(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator+ ( /*iterator*/ i, difference_type n ) requires /*advanceable*/<W>; | (1) | (since C++20) |
|---|---|---|
| friend constexpr /*iterator*/ operator+ ( difference_type n, /*iterator*/ i ) requires /*advanceable*/<W>; | (2) | (since C++20) |
Equivalent to i += n; return i;.
These functions are not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when iterator is an associated class of the arguments.
operator-(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator- ( /*iterator*/ i, difference_type n ) requires /*advanceable*/<W>; | (1) | (since C++20) |
|---|---|---|
| friend constexpr difference_type operator- ( const /*iterator*/& x, const /*iterator*/& y ) requires /*advanceable*/<W>; | (2) | (since C++20) |
Equivalent to i -= n; return i;.
Let
Dbedifference_type:
- If
Wis an integer-like type:- If
Wis signed-integer-like, returns D(D(x._[value](iterator.html#value)_) - D(y._[value](iterator.html#value)_)). - Otherwise, returns y.
_[value](iterator.html#value)_> x._[value](iterator.html#value)_? D(-D(y._[value](iterator.html#value)_- x._[value](iterator.html#value)_)) : D(x._[value](iterator.html#value)_- y._[value](iterator.html#value)_).
- If
- Otherwise, returns x.
_[value](iterator.html#value)_- y._[value](iterator.html#value)_.
These functions are not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when iterator is an associated class of the arguments.
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P2259R1 | C++20 | member iterator_category is always defined | defined only if W satisfies incrementable |
| LWG 3580 | C++20 | bodies of operator+ and operator- rule out implicit move | made suitable for implicit move |