std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/; | (1) | (только для пояснения*) |
| Вспомогательные шаблоны псевдонимов | ||
template< class I > using /*iota-diff-t*/ = /* see below */; | (2) | (только для пояснения*) |
| Вспомогательные концепты | ||
template< class I >
concept /*decrementable*/ =
std::incrementable<I> && requires(I i)
{
{ --i } -> std::same_as<I&>;
{ i-- } -> std::same_as<I>;
};
| (3) | (только для пояснения*) |
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) | (только для пояснения*) |
iterator — это тип итераторов, возвращаемых функциями begin() и end() класса ranges::iota_view<W,Bound>.- Если
Iне является целочисленным типом или если он является целочисленным типом иsizeof(std::iter_difference_t<I>)больше, чемsizeof(I), то /*iota-diff-t*/<I> — это std::iter_difference_t<I>. - В противном случае /*iota-diff-t*/<I> — это знаковый целочисленный тип, ширина которого больше ширины
I, если такой тип существует. - В противном случае
Iявляется одним из целочисленных типов наибольшей ширины, а /*iota-diff-t*/<I> — это неуказанный знаковый целочисленноподобный тип, ширина которого не меньше шириныI. Не указано, моделирует ли /*iota-diff-t*/<I> концептweakly_incrementableв этом случае.
incrementable, а префиксная и постфиксная операции operator-- для этого типа имеют общий смысл.decrementable и totally_ordered, а операции operator+=, operator-=, operator+ и operator- для типа и его типа-разности имеют общий смысл./*iterator*/ моделирует концепт
-
random_access_iterator, еслиWмоделируетadvanceable(4), -
bidirectional_iterator, еслиWмоделируетdecrementable(3), -
forward_iterator, еслиWмоделируетincrementable, и -
input_iteratorв противном случае.
Однако он удовлетворяет требованиям LegacyInputIterator, только если W моделирует incrementable; в противном случае он не удовлетворяет требованиям LegacyInputIterator.
Семантические требования
3) ТипI моделирует decrementable, только если I удовлетворяет требованиям decrementable и моделируются все включаемые им концепты, а для равных объектов a и b типа I выполняются следующие условия: - Если
aиbвходят в область определения как префиксной, так и постфиксной операцииoperator--(то есть для них определена операция декремента), то все следующие выраженияtrue:-
std::addressof(--a) == std::addressof(a), -
bool(a-- == b), -
bool(((void)a--, a) == --b), -
bool(++(--a) == b).
-
- Если
aиbвходят в область определения как префиксной, так и постфиксной операцииoperator++(то есть для них определена операция инкремента), тоbool(--(++a) == b)являетсяtrue.
D обозначает /*iota-diff-t*/<I>. Тип I моделирует advanceable, только если I удовлетворяет требованиям advanceable и моделируются все включаемые им концепты, а для следующих объектов: - объектов
aиbтипаIи - значения
nтипаD,
таких, что b достижимо из a после n применений ++a, выполняются все следующие условия:
-
(a += n)равноb. -
std::addressof(a += n)равноstd::addressof(a). -
I(a + n)равно(a += n). - Для любых двух положительных значений
xиyтипаD, еслиI(a + D(x + y))корректно определено, тоI(a + D(x + y))равноI(I(a + x) + y). -
I(a + D(0))равноa. - Если
I(a + D(n - 1))корректно определено, тоI(a + n)равно[](I c) { return ++c; }(I(a + D(n - 1))). -
(b += -n)равноa. -
(b -= n)равноa. -
std::addressof(b -= n)равноstd::addressof(b). -
I(b - n)равно(b -= n). -
D(b - a)равноn. -
D(a - b)равноD(-n). -
bool(a <= b)являетсяtrue.
Вложенные типы
| Тип | Определение |
|---|---|
iterator_concept | тег итератора, см. ниже |
iterator_category(присутствует только если W моделирует incrementable и/*iota-diff-t*/<W> является целочисленным типом) |
std::input_iterator_tag |
value_type |
W |
difference_type | /*iota-diff-t*/<W> |
Определение концепта итератора
iterator_concept определяется следующим образом:
- Если
Wмоделируетadvanceable,iterator_conceptобозначаетstd::random_access_iterator_tag. - В противном случае, если
Wмоделируетdecrementable,iterator_conceptобозначаетstd::bidirectional_iterator_tag. - В противном случае, если
Wмоделируетincrementable,iterator_conceptобозначаетstd::forward_iterator_tag. - В противном случае
iterator_conceptобозначаетstd::input_iterator_tag.
Поля данных
| Поле | Описание |
|---|---|
W value_ | текущее значение (объект-член, используемый только для пояснения*) |
Функции-члены
std::ranges::iota_view::iterator::iterator
/*iterator*/() requires std::default_initializable<W> = default; | (1) | (начиная с C++20) |
constexpr explicit /*iterator*/( W value ); | (2) | (начиная с C++20) |
value_ значением по умолчанию.std::ranges::iota_view::iterator::operator*
constexpr W operator*() const
noexcept(std::is_nothrow_copy_constructible_v<W>);
| (начиная с C++20) |
Возвращает value_.
Пример
#include <cassert>
#include <ranges>
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) | (начиная с C++20) |
constexpr void operator++(int); | (2) | (начиная с C++20) |
constexpr /*iterator*/ operator++(int) requires std::incrementable<W>; | (3) | (начиная с C++20) |
++value_ ;return*this;.++value_ ;.autotmp=*this;++value_ ;returntmp;.Пример
#include <cassert>
#include <ranges>
int main()
{
auto it{std::views::iota(8).begin()};
assert(*it == 8);
assert(*++it == 9);
assert(*it++ == 9);
assert(*it == 10);
}
std::ranges::iota_view::iterator::operator--
constexpr /*iterator*/& operator--() requires /*decrementable*/<W>; | (1) | (начиная с C++20) |
constexpr /*iterator*/operator--(int) requires /*decrementable*/<W>; | (2) | (начиная с C++20) |
--value_ ;return*this;.autotmp=*this;--value_ ;returntmp;.Пример
#include <cassert>
#include <ranges>
int main()
{
auto it{std::views::iota(8).begin()};
assert(*it == 8);
assert(*--it == 7);
assert(*it-- == 7);
assert(*it == 6);
}
std::ranges::iota_view::iterator::operator+=
constexpr /*iterator*/& operator+=( difference_type n )
requires /*advanceable*/<W>;
| (начиная с C++20) |
Обновляет value_ и возвращает *this:
- Если
Wявляется беззнаковым целочисленноподобным типом: - В противном случае выполняет
value_ += n.
Пример
#include <cassert>
#include <ranges>
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>;
| (начиная с C++20) |
Обновляет value_ и возвращает *this:
- Если
Wявляется беззнаковым целочисленноподобным типом: - В противном случае выполняет
value_ -= n.
Пример
#include <cassert>
#include <ranges>
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>;
| (начиная с C++20) |
Возвращает W(value_ + n).
Пример
#include <cassert>
#include <ranges>
int main()
{
auto it{std::views::iota(6).begin()};
assert(*it == 6);
assert(*(it + 3) == 9);
} Функции, не являющиеся членами
operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)
friend constexpr bool operator==
( const /*iterator*/& x, const /*iterator*/& y )
requires std::equality_comparable<W>;
| (1) | (начиная с C++20) |
friend constexpr bool operator<
( const /*iterator*/& x, const /*iterator*/& y )
requires std::totally_ordered<W>;
| (2) | (начиная с C++20) |
friend constexpr bool operator>
( const /*iterator*/& x, const /*iterator*/& y )
requires std::totally_ordered<W>;
| (3) | (начиная с C++20) |
friend constexpr bool operator<=
( const /*iterator*/& x, const /*iterator*/& y )
requires std::totally_ordered<W>;
| (4) | (начиная с C++20) |
friend constexpr bool operator>=
( const /*iterator*/& x, const /*iterator*/& y )
requires std::totally_ordered<W>;
| (5) | (начиная с C++20) |
friend constexpr bool operator<=>
( const /*iterator*/& x, const /*iterator*/& y )
requires std::totally_ordered<W> && std::three_way_comparable<W>;
| (6) | (начиная с C++20) |
y < x.!(y < x).!(x < y).Оператор != синтезируется из operator==.
Эти функции не видны при обычном неквалифицированном или квалифицированном поиске и могут быть найдены только с помощью поиска, зависящего от аргументов, если iterator является ассоциированным классом аргументов.
operator+(std::ranges::iota_view::iterator)
friend constexpr /*iterator*/ operator+
( /*iterator*/ i, difference_type n )
requires /*advanceable*/<W>;
| (1) | (начиная с C++20) |
friend constexpr /*iterator*/ operator+
( difference_type n, /*iterator*/ i )
requires /*advanceable*/<W>;
| (2) | (начиная с C++20) |
Эквивалентно i += n; return i;.
Эти функции не видны при обычном неквалифицированном или квалифицированном поиске и могут быть найдены только с помощью поиска, зависящего от аргументов, если iterator является ассоциированным классом аргументов.
operator-(std::ranges::iota_view::iterator)
friend constexpr /*iterator*/ operator-
( /*iterator*/ i, difference_type n )
requires /*advanceable*/<W>;
| (1) | (начиная с C++20) |
friend constexpr difference_type operator-
( const /*iterator*/& x, const /*iterator*/& y )
requires /*advanceable*/<W>;
| (2) | (начиная с C++20) |
i -= n; return i;.D будет равно difference_type: - Если
Wявляется целочисленноподобным типом: - В противном случае возвращает
x.value_ - y.value_.
Эти функции не видны при обычном неквалифицированном или квалифицированном поиске и могут быть найдены только с помощью поиска, зависящего от аргументов, если iterator является ассоциированным классом аргументов.
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применимо к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| P2259R1 | C++20 | член iterator_category всегда определен | определен, только если W удовлетворяет требованиям incrementable |
| LWG 3580 | C++20 | тела operator+ и operator- исключают неявное перемещение | изменены для поддержки неявного перемещения |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/iota_view/iterator