Spec-Zone.ru › C++

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) (только для пояснения*)
1) ranges::iota_view<W,Bound>::iterator — это тип итераторов, возвращаемых функциями begin() и end() класса ranges::iota_view<W,Bound>.
2) Вычисляет тип разности для обоих типов итераторов и целочисленноподобных типов.
  • Если 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 в этом случае.
3) Задает условие, что тип является incrementable, а префиксная и постфиксная операции operator-- для этого типа имеют общий смысл.
4) Задает условие, что тип является одновременно 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.
4) Пусть 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)
1) Инициализирует value_ значением по умолчанию.
2) Инициализирует value_ значением 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)
1) Эквивалентно ++value_ ;return*this;.
2) Эквивалентно ++value_ ;.
3) Эквивалентно 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)
1) Эквивалентно --value_ ;return*this;.
2) Эквивалентно 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 является беззнаковым целочисленноподобным типом:
    • Если n неотрицательно, выполняет value_ += static_cast<W>(n).
    • В противном случае выполняет value_ -= static_cast<W>(-n).
  • В противном случае выполняет 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 является беззнаковым целочисленноподобным типом:
    • Если n неотрицательно, выполняет value_ -= static_cast<W>(n).
    • В противном случае выполняет value_ += static_cast<W>(-n).
  • В противном случае выполняет 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)
1) Возвращает x.value_ == y.value_.
2) Возвращает x.value_ < y.value_.
3) Возвращает y < x.
4) Возвращает !(y < x).
5) Возвращает !(x < y).
6) Возвращает x.value_ <=> y.value_.

Оператор != синтезируется из 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)
1) Эквивалентно i -= n; return i;.
2) Пусть D будет равно difference_type:
  • Если W является целочисленноподобным типом:
    • Если W является знаковым целочисленноподобным типом, возвращает D(D(x.value_ ) - D(y.value_ )).
    • В противном случае возвращает y.value_ > x.value_ ? D(-D(y.value_ - x.value_ )) : D(x.value_ - y.value_ ).
  • В противном случае возвращает 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API