Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
struct /*iterator*/ ;
(1) ( solo para exposición* )
Plantillas de alias auxiliares
template < class I >
using /*iota-diff-t*/ = /* ver abajo */ ;
(2) ( solo para exposición* )
Conceptos auxiliares
template < class I >

concepto /*decrementable*/ =
std:: incrementable < I > && requiere ( I i ) {
{ -- i } - > std:: same_as < I & > ;
{ i -- } - > std:: same_as < I > ;

} ;
(3) ( solo para exposición* )
template < class I >

concept /*avanzable*/ =
/*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) ( solo para exposición* )
1) ranges:: iota_view < W, Bound > :: iterator es el tipo de los iteradores devueltos por begin() y end() de ranges:: iota_view < W, Bound > .
2) Calcula el tipo de diferencia para ambos tipos de iterador y tipos similares a enteros .
  • Si I no es un tipo integral, o si es un tipo integral y sizeof ( std:: iter_difference_t < I > ) es mayor que sizeof ( I ) , entonces /*iota-diff-t*/ < I > es std:: iter_difference_t < I > .
  • De lo contrario, /*iota-diff-t*/ < I > es un tipo entero con signo de ancho mayor que el ancho de I si tal tipo existe.
  • De lo contrario, I es uno de los tipos integrales más anchos, y /*iota-diff-t*/ < I > es un tipo similar a entero con signo no especificado de ancho no menor que el ancho de I . No está especificado si /*iota-diff-t*/ < I > modela weakly_incrementable en este caso.
3) Especifica que un tipo es incrementable , y los operadores de pre- y post- operator -- para el tipo tienen el significado común.
4) Especifica que un tipo es tanto decrementable como totally_ordered , y que operator + = , operator - = , operator + , y operator - entre el tipo y sus diferentes tipos tienen significado común.

/*iterator*/ modelos

Sin embargo, solo satisface LegacyInputIterator si W modela incrementable , y no satisface LegacyInputIterator en caso contrario.

Contenidos

Requisitos semánticos

3) El tipo I modela decrementable solo si I satisface decrementable y todos los conceptos que subsume están modelados, y dados objetos iguales a y b de tipo I :
  • Si a y b están en el dominio tanto del pre- como del post- operator -- (es decir, son decrementables), entonces todas las siguientes son true :
  • Si a y b están en el dominio tanto del pre- como del post- operator ++ (es decir, son incrementables), entonces bool ( -- ( ++ a ) == b ) es 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
  • objetos a y b de tipo I y
  • valor n de tipo D ,

tal que b es alcanzable desde a después de n aplicaciones de ++ a , se satisfacen todas las siguientes condiciones:

  • ( a + = n ) es igual a b .
  • std:: addressof ( a + = n ) es igual a std:: addressof ( a ) .
  • I ( a + n ) es igual a ( a + = n ) .
  • Para cualesquiera dos valores positivos x y y de tipo D , si I ( a + D ( x + y ) ) está bien definido, entonces I ( a + D ( x + y ) ) es igual a I ( I ( a + x ) + y ) .
  • I ( a + D ( 0 ) ) es igual a a .
  • Si I ( a + D ( n - 1 ) ) está bien definido, entonces I ( a + n ) es igual a [ ] ( I c ) { return ++ c ; } ( I ( a + D ( n - 1 ) ) ) .
  • ( b + = - n ) es igual a a .
  • ( b - = n ) es igual a a .
  • std:: addressof ( b - = n ) es igual a std:: addressof ( b ) .
  • I ( b - n ) es igual a ( b - = n ) .
  • D ( b - a ) es igual a n .
  • D ( a - b ) es igual a D ( - n ) .
  • bool ( a <= b ) es true .

Tipos anidados

Tipo Definición
iterator_concept una etiqueta de iterador , ver más abajo
iterator_category
(solo presente si W modela incrementable y
/*iota-diff-t*/ < W > es un tipo integral)
std::input_iterator_tag
value_type W
difference_type /*iota-diff-t*/ < W >

Determinando el concepto de iterador

iterator_concept se define de la siguiente manera:

Miembros de datos

Miembro Definición
W value_ el valor actual
( objeto miembro solo para exposición* )

Funciones miembro

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

/*iterator*/ ( ) requires std:: default_initializable < W > = default ;
(1) (desde C++20)
constexpr explicit /*iterator*/ ( W value ) ;
(2) (desde C++20)
1) Inicializa por valor value_ .
2) Inicializa value_ con value .

std::ranges::iota_view:: iterator :: operator*

constexpr W operator * ( ) const
noexcept ( std:: is_nothrow_copy_constructible_v < W > ) ;
(desde C++20)

Devuelve value_ .

Ejemplo

#include <cassert>
#include <ranges>
int main()
{
    auto it{std::views::iota(6, 9).begin()};
    const int& r = *it; // se enlaza con temporal
    assert(*it == 6 and r == 6);
    ++it;
    assert(*it == 7 and r == 6);
}

std::ranges::iota_view:: iterator :: operador++

constexpr /*iterator*/ & operator ++ ( ) ;
(1) (desde C++20)
constexpr void operator ++ ( int ) ;
(2) (desde C++20)
constexpr /*iterator*/ operator ++ ( int ) requires std:: incrementable < W > ;
(3) (desde C++20)
1) Equivalente a ++ value_  ; return * this ; .
2) Equivalente a ++ value_  ; .
3) Equivalente a auto tmp = * this ; ++ value_  ; return tmp ; .

Ejemplo

#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 :: operador--

constexpr /*iterator*/ & operator -- ( ) requires /*decrementable*/ < W > ;
(1) (desde C++20)
constexpr /*iterator*/ operator -- ( int ) requires /*decrementable*/ < W > ;
(2) (desde C++20)
1) Equivalente a -- value_  ; return * this ; .
2) Equivalente a auto tmp = * this ; -- value_  ; return tmp ; .

Ejemplo

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

Actualiza value_ y retorna * this :

Ejemplo

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

Actualiza value_ y retorna * this :

Ejemplo

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

Devuelve W ( value_ + n ) .

Ejemplo

#include <cassert>
#include <ranges>
int main()
{
    auto it{std::views::iota(6).begin()};
    assert(*it == 6);
    assert(*(it + 3) == 9);
}

Funciones no miembro

operator==, <, >, <=, >=, <=> (std::ranges::iota_view:: iterator )

friend constexpr bool operator ==

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

requires std:: equality_comparable < W > ;
(1) (desde C++20)
friend constexpr bool operator <

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

requires std:: totally_ordered < W > ;
(2) (desde C++20)
friend constexpr bool operator >

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

requires std:: totally_ordered < W > ;
(3) (desde C++20)
friend constexpr bool operator <=

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

requires std:: totally_ordered < W > ;
(4) (desde C++20)
friend constexpr bool operator >=

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

requires std:: totally_ordered < W > ;
(5) (desde C++20)
friend constexpr bool operator <=>

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

requires std:: totally_ordered < W > && std:: three_way_comparable < W > ;
(6) (desde C++20)
1) Devuelve x. value_ == y. value_ .
2) Devuelve x. value_ < y. value_ .
3) Devuelve y < x .
4) Devuelve ! ( y < x ) .
5) Devuelve ! ( x < y ) .
6) Devuelve x. value_ <=> y. value_ .

El operador != es sintetizado a partir de operator== .

Estas funciones no son visibles para la búsqueda unqualified o qualified lookup ordinaria, y solo pueden ser encontradas mediante argument-dependent lookup cuando iterator es una clase asociada de los argumentos.

operator+ (std::ranges::iota_view:: iterator )

friend constexpr /*iterator*/ operator +

( /*iterator*/ i, difference_type n )

requires /*advanceable*/ < W > ;
(1) (desde C++20)
friend constexpr /*iterator*/ operator +

( difference_type n, /*iterator*/ i )

requires /*advanceable*/ < W > ;
(2) (desde C++20)

Equivalente a i + = n ; return i ; .

Estas funciones no son visibles para la búsqueda no calificada ordinaria o la búsqueda calificada , y solo pueden ser encontradas mediante búsqueda dependiente de argumentos cuando iterator es una clase asociada de los argumentos.

operador- (std::ranges::iota_view:: iterator )

friend constexpr /*iterator*/ operator -

( /*iterator*/ i, difference_type n )

requires /*advanceable*/ < W > ;
(1) (desde C++20)
friend constexpr difference_type operator -

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

requires /*advanceable*/ < W > ;
(2) (desde C++20)
1) Equivalente a i - = n ; return i ; .
2) Sea D igual a difference_type :

Estas funciones no son visibles para la búsqueda no calificada ordinaria o la búsqueda calificada , y solo pueden encontrarse mediante búsqueda dependiente de argumentos cuando iterator es una clase asociada de los argumentos.

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
P2259R1 C++20 member iterator_category está siempre definido definido solo si W satisface incrementable
LWG 3580 C++20 los cuerpos de operator + y operator - excluyen el movimiento implícito hecho adecuado para movimiento implícito