Namespaces
Variants

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

De fr.cppreference.net
 
 
Bibliothèque de ranges
Adaptateurs de ranges
 
 
struct /*iterator*/;
(1) (exposition uniquement*)
Modèles d'alias auxiliaires
template< class I >
using /*iota-diff-t*/ = /* see below */;
(2) (exposition uniquement*)
Concepts auxiliaires
template< class I >
concept /*decrementable*/ =
    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 différence pour les deux types d'itérateurs et les integer-like types.
  • Si I n'est pas un type intégral, ou si c'est un type intégral 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 à la largeur de I si un tel type existe.
  • Sinon, I est l'un des types intégraux les plus larges, et /*iota-diff-t*/<I> est un type signed-integer-like type non spécifié de largeur au moins égale à la largeur 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 pré- et post- operator-- pour le 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- parmi le type et son type différent ont une signification commune.

/*iterator*/ modélise

Cependant, il ne satisfait que LegacyInputIterator si W modélise incrementable, et ne satisfait pas LegacyInputIterator sinon.

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 Description
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