std::ranges::views::iota, std::ranges::iota_view
template<std::weakly_incrementable W, std::semiregular Bound = std::unreachable_sentinel_t> |
(1) | (since C++20) |
namespace views { inline constexpr /*unspecified*/ iota = /*unspecified*/; |
(2) | (since C++20) |
E
and F
Expression-equivalent
Expression e is expression-equivalent to expression f, if e and f have the same effects, either are both potentially-throwing or are both not potentially-throwing (i.e. noexcept(e) == noexcept(f)), and either are both constant subexpressions or are both not constant subexpressions.
Helper templates
template<std::weakly_incrementable W, std::semiregular Bound> inline constexpr bool enable_borrowed_range<ranges::iota_view<W, Bound>> = true; |
||
This specialization of std::ranges::enable_borrowed_range makes iota_view
satisfy borrowed_range.
Data members
std::ranges::iota_view::base_
W value_ = W(); /* exposition-only */ |
||
the current value
std::ranges::iota_view::pred_
Bound bound_ = Bound(); /* exposition-only */ |
||
the bound (defaults to std::unreachable_sentinel_t)
Member functions
std::ranges::iota_view::iota_view
iota_view() = default; |
(1) | |
constexpr explicit iota_view(W value); |
(2) | |
constexpr iota_view(std::type_identity_t<W> value, std::type_identity_t<Bound> bound); |
(3) | |
value_
and bound_
value_
with value and expects that Bound
is either unreachable_sentinel_t
(the default) or Bound() is reachable from value. This constructor is used to create unbounded iota views, e.g. iota(0) yields numbers 0,1,2..., infinitely.value_
with value and bound_
with bound
. This constructor is used to create bounded iota views, e.g. iota(10, 20) yields numbers from 10 to 19.Parameters
value | - | the starting value |
bound | - | the bound |
std::ranges::iota_view::begin
constexpr iterator begin() const; |
||
Returns the iterator initialized with value_
std::ranges::iota_view::end
constexpr auto end() const; |
(1) | |
constexpr iterator end() const requires std::same_as<W, Bound>; |
(2) | |
std::ranges::iota_view::size
constexpr auto size() const requires (std::same_as<W, Bound> && __Advanceable<W>) || |
||
Returns the size of the view if the view is bounded.
Deduction guides
template<class W, class Bound> requires (!__is_integer_like<W> || !__is_integer_like<Bound> || |
||
Note that the guide protects itself against signed/unsigned mismatch bugs, like views::iota(0, v.size()), where 0
is a (signed) int
and v.size()
is an (unsigned) std::size_t
.
Nested classes
std::ranges::iota_view::iterator
template<class W, class Bound> struct iota_view<W, Bound>::iterator; /* exposition-only */ |
||
The return type of iota_view::begin
.
This is a random_access_iterator if W models __Advanceable, a bidirectional_iterator if W models __Decrementable, a forward_iterator if W models incrementable, and input_iterator otherwise. However, it is only a LegacyInputIterator.
std::ranges::iota_view::iterator::iterator
constexpr explicit iterator(W value); |
||
Initializes exposition-only data member value_ with value. This value will be returned by operator* and incremented by operator++
std::ranges::iota_view::iterator::operator*
constexpr W operator*() const noexcept(std::is_nothrow_copy_constructible_v<W>); |
||
returns the current value, by value (in other words, this is a read-only view)
std::ranges::iota_view::iterator::operator++
constexpr iterator& operator++() |
(1) | |
constexpr void operator++(int) |
(2) | |
constexpr iterator operator++(int) requires std::incrementable<W>; |
(3) | |
std::ranges::iota_view::iterator::operator--
constexpr iterator& operator--() requires __Decrementable<W>; |
(1) | |
constexpr iterator operator--(int) requires __Decrementable<W>; |
(2) | |
std::ranges::iota_view::iterator::operator[]
constexpr W operator[](difference_type n) const requires __Advanceable<W>; |
||
Equivalent to return W(value_ + n);
Other members as expected of an iterator.
std::ranges::iota_view::sentinel
template<class W, class Bound> struct iota_view<W, Bound>::sentinel; /* exposition-only */ |
||
The return type of iota_view::end
.
std::ranges::iota_view::sentinel::bound_
Bound bound_ = Bound(); /* exposition only */ |
||
Exposition-only data member holding the sentinel (typically either a number, for a bounded iota view, or an instance of std::unreachable_sentinel_t for an unbounded iota view.
std::ranges::iota_view::sentinel::sentinel
sentinel() = default; constexpr explicit sentinel(Bound bound); |
||
Initializes exposition-only data member bound_ with bound.
std::ranges::iota_view::sentinel::operator==
friend constexpr bool operator==(const iterator& x, const sentinel& y); |
||
Equivalent to: x.value_ == y.bound_;.
std::ranges::iota_view::sentinel::operator-
friend constexpr std::iter_difference_t<W> operator-(const iterator& x, const sentinel& y) |
(1) | |
friend constexpr std::iter_difference_t<W> operator-(const sentinel& x, const iterator& y) |
(2) | |
Example
#include <ranges> #include <iostream> int main() { for (int i : std::ranges::iota_view{1, 10}) std::cout << i << ' '; std::cout << '\n'; for (int i : std::views::iota(1, 10)) std::cout << i << ' '; std::cout << '\n'; for (int i : std::views::iota(1) | std::views::take(9)) std::cout << i << ' '; std::cout << '\n'; }
Output:
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9