Namespaces
Variants

std::ranges::subrange<I,S,K>:: advance

From cppreference.net
Ranges library
Range adaptors
constexpr subrange & advance ( std:: iter_difference_t < I > n ) ;
(depuis C++20)

Incrémente ou décrémente begin_ :

Équivalent à : ranges:: advance ( begin_  , n ) ;
if constexpr ( StoreSize  )
size_ + = to-unsigned-like  ( - n ) ;
return * this ;
.
  • Sinon, incrémente begin_ de n éléments, ou jusqu'à ce que end_ soit atteint.
Équivalent à : auto d = n - ranges:: advance ( begin_  , n, end_  ) ;
if constexpr ( StoreSize  )
size_ - = to-unsigned-like  ( d ) ;
return * this ;
.


Selon les préconditions de ranges::advance , si n < 0 est true et que begin_ ne peut pas être décrémenté de - n éléments, le comportement est indéfini.

Table des matières

Paramètres

n - nombre d'incrémentations maximales de l'itérateur

Valeur de retour

* this

Exemple

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <ranges>
void print(auto name, auto const sub)
{
    std::cout << name << ".size() == " << sub.size() << "; { ";
    std::ranges::for_each(sub, [](int x) { std::cout << x << ' '; });
    std::cout << "}\n";
};
int main()
{
    std::array arr{1, 2, 3, 4, 5, 6, 7};
    std::ranges::subrange sub{std::next(arr.begin()), std::prev(arr.end())};
    print("1) sub", sub);
    print("2) sub", sub.advance(3));
    print("3) sub", sub.advance(-2));
}

Sortie :

1) sub.size() == 5; { 2 3 4 5 6 }
2) sub.size() == 2; { 5 6 }
3) sub.size() == 4; { 3 4 5 6 }

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 S'applique à Comportement tel que publié Comportement corrigé
LWG 3433 C++20 le comportement était indéfini si n < 0 rendu bien défini si begin_ peut être décrémenté

Voir aussi

obtient une copie du subrange avec son itérateur avancé d'une distance donnée
(fonction membre publique)
obtient une copie du subrange avec son itérateur décrémenté d'une distance donnée
(fonction membre publique)
avance un itérateur d'une distance donnée
(fonction template)
avance un itérateur d'une distance donnée ou jusqu'à une limite donnée
(objet fonction algorithme)