Namespaces
Variants

std::ranges::iota_view<W, Bound>::iterator

Начиная с ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
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*/ моделирует

Однако он удовлетворяет условию LegacyInputIterator, только если W моделирует incrementable, и не удовлетворяет условию LegacyInputIterator в противном случае.

Семантические требования

3) Тип I моделирует decrementable только если I удовлетворяет decrementable и все подразумеваемые концепты моделируются, и для равных объектов a и b типа I :
  • Если a и b находятся в области определения как пре-, так и пост- operator -- (т.е. они декрементируемы), тогда все следующие выражения true :
  • Если a и b находятся в области определения как пре-, так и пост- operator ++ (т.е. они инкрементируемы), тогда bool ( -- ( ++ a ) == b ) является true .
4) Let D denote /*iota-diff-t*/ < I > . Type I models advanceable only if I satisfies advanceable and all concepts it subsumes are modeled, and given
  • объекты 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 value_ текущее значение
(объект-член только для демонстрации*)

Функции-члены

std::ranges::iota_view:: iterator :: iterator

/*iterator*/ ( ) requires std:: default_initializable < W > = default ;
(1) (since C++20)
constexpr explicit /*iterator*/ ( W value ) ;
(2) (since 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 > ) ;
(since C++20)

Возвращает value_ .

Пример

#include <cassert>
#include <ranges>
int main()
{
    auto it{std::views::iota(6, 9).begin()};
    const int& r = *it; // связывается с временным объектом
    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) Эквивалентно auto tmp = * this ; ++ value_  ; return tmp ; .

Пример

#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) (since C++20)
constexpr /*iterator*/ operator -- ( int ) requires /*decrementable*/ < W > ;
(2) (since C++20)
1) Эквивалентно -- value_  ; return * this ; .
2) Эквивалентно auto tmp = * this ; -- value_  ; return tmp ; .

Пример

#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 > ;
(since C++20)

Обновляет value_ и возвращает * this :

Пример

#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 > ;
(since C++20)

Обновляет value_ и возвращает * this :

Пример

#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 > ;
(since 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== .

Эти функции не видны при обычном unqualified или qualified lookup , и могут быть найдены только с помощью argument-dependent lookup , когда 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) (since C++20)
friend constexpr difference_type operator -

( const /*iterator*/ & x, const /*iterator*/ & y )

requires /*advanceable*/ < W > ;
(2) (since C++20)
1) Эквивалентно i - = n ; return i ; .
2) Пусть D будет difference_type :

Эти функции не видны при обычном неквалифицированном или квалифицированном поиске и могут быть найдены только с помощью поиска, зависимого от аргументов , когда iterator является ассоциированным классом аргументов.

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

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