Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
struct /*iterator*/ ;
(1) ( exposition seulement* )
Modèles d'alias d'assistance
template < class I >
using /*iota-diff-t*/ = /* voir ci-dessous */ ;
(2) ( exposition uniquement* )
Concepts auxiliaires
template < class I >

concept /*décrémentable*/ =
std:: incrementable < I > && requires ( I i ) {
{ -- i } - > std:: same_as < I & > ;
{ i -- } - > std:: same_as < I > ;

} ;
(3) ( exposition uniquement* )
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) ( exposition uniquement* )
1) ranges:: iota_view < W, Bound > :: iterator est le type des itérateurs retournés par begin() et end() de ranges:: iota_view < W, Bound > .
2) Calcule le type de différence pour les types d'itérateurs et les types de type entier .
  • Si I n'est pas un type entier, ou s'il s'agit d'un type entier et que sizeof ( std:: iter_difference_t < I > ) est supérieur à sizeof ( I ) , alors /*iota-diff-t*/ < I > est std:: iter_difference_t < I > .
  • Sinon, /*iota-diff-t*/ < I > est un type entier signé de largeur supérieure à celle de I si un tel type existe.
  • Sinon, I est l'un des types entiers les plus larges, et /*iota-diff-t*/ < I > est un type de type entier signé non spécifié de largeur non inférieure à celle de I . Il n'est pas spécifié si /*iota-diff-t*/ < I > modélise weakly_incrementable dans ce cas.
3) Spécifie qu'un type est incrementable , et que les opérateurs pré- et post- operator -- pour ce type ont une signification commune.
4) Spécifie qu'un type est à la fois decrementable et totally_ordered , et que operator + = , operator - = , operator + , et operator - entre le type et ses différents types ont une signification commune.

/*iterator*/ modèles

Cependant, il ne satisfait LegacyInputIterator que si W modélise incrementable , et ne satisfait pas LegacyInputIterator dans le cas contraire.

Table des matières

Exigences sémantiques

3) Le type I modélise decrementable seulement si I satisfait decrementable et tous les concepts qu'il subsume sont modélisés, et étant donné des objets égaux a et b de type I :
  • Si a et b sont dans le domaine des opérateurs pré- et post- operator -- (c'est-à-dire qu'ils sont décrémentables), alors toutes les expressions suivantes sont true :
  • Si a et b sont dans le domaine des opérateurs pré- et post- operator ++ (c'est-à-dire qu'ils sont incrémentables), alors bool ( -- ( ++ a ) == b ) est 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
  • objets a et b de type I et
  • valeur n de type D ,

tel que b soit accessible depuis a après n applications de ++ a , toutes les conditions suivantes sont satisfaites :

  • ( a + = n ) est égal à b .
  • std:: addressof ( a + = n ) est égal à std:: addressof ( a ) .
  • I ( a + n ) est égal à ( a + = n ) .
  • Pour deux valeurs positives quelconques x et y de type D , si I ( a + D ( x + y ) ) est bien défini, alors I ( a + D ( x + y ) ) est égal à I ( I ( a + x ) + y ) .
  • I ( a + D ( 0 ) ) est égal à a .
  • Si I ( a + D ( n - 1 ) ) est bien défini, alors I ( a + n ) est égal à [ ] ( I c ) { return ++ c ; } ( I ( a + D ( n - 1 ) ) ) .
  • ( b + = - n ) est égal à a .
  • ( b - = n ) est égal à a .
  • std:: addressof ( b - = n ) est égal à std:: addressof ( b ) .
  • I ( b - n ) est égal à ( b - = n ) .
  • D ( b - a ) est égal à n .
  • D ( a - b ) est égal à D ( - n ) .
  • bool ( a <= b ) est true .

Types imbriqués

Type Définition
iterator_concept une balise d'itérateur , voir ci-dessous
iterator_category
(présent uniquement si W modélise incrementable et
/*iota-diff-t*/ < W > est un type entier)
std::input_iterator_tag
value_type W
difference_type /*iota-diff-t*/ < W >

Détermination du concept d'itérateur

iterator_concept est défini comme suit :

Membres de données

Membre Définition
W value_ la valeur actuelle
( objet membre d'exposition uniquement* )

Fonctions membres

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) Initialise par défaut value_ .
2) Initialise value_ avec value .

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

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

Retourne value_ .

Exemple

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

std::ranges::iota_view:: iterator :: operator++

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

Exemple

#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) (depuis C++20)
constexpr /*iterator*/ operator -- ( int ) requires /*decrementable*/ < W > ;
(2) (depuis C++20)
1) Équivalent à -- value_  ; return * this ; .
2) Équivalent à auto tmp = * this ; -- value_  ; return tmp ; .

Exemple

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

Met à jour value_ et retourne * this :

Exemple

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

Met à jour value_ et retourne * this :

Exemple

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

Retourne W ( value_ + n ) .

Exemple

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

Fonctions non membres

opérateur==, <, >, <=, >=, <=> (std::ranges::iota_view:: iterator )

friend constexpr bool operator ==

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

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

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

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

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

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

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

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

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

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

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

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

L'opérateur != est synthétisé à partir de operator== .

Ces fonctions ne sont pas visibles par la recherche non qualifiée ou qualifiée ordinaire, et ne peuvent être trouvées que par la recherche dépendante des arguments lorsque iterator est une classe associée des arguments.

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

friend constexpr /*iterator*/ operator +

( /*iterator*/ i, difference_type n )

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

( difference_type n, /*iterator*/ i )

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

Équivalent à i + = n ; return i ; .

Ces fonctions ne sont pas visibles par la recherche non qualifiée ordinaire ou la recherche qualifiée , et ne peuvent être trouvées que par la recherche dépendante des arguments lorsque iterator est une classe associée des arguments.

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

friend constexpr /*iterator*/ operator -

( /*iterator*/ i, difference_type n )

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

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

requires /*advanceable*/ < W > ;
(2) (depuis C++20)
1) Équivalent à i - = n ; return i ; .
2) Soit D le type difference_type :

Ces fonctions ne sont pas visibles par la recherche non qualifiée ou recherche qualifiée ordinaire, et ne peuvent être trouvées que par la recherche dépendante des arguments lorsque iterator est une classe associée des arguments.

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
P2259R1 C++20 le membre iterator_category est toujours défini défini uniquement si W satisfait incrementable
LWG 3580 C++20 les corps de operator + et operator - empêchent le déplacement implicite rendus compatibles avec le déplacement implicite