std::ranges:: next
|
Défini dans l'en-tête
<iterator>
|
||
|
Signature d'appel
|
||
|
template
<
std::
input_or_output_iterator
I
>
constexpr I next ( I i ) ; |
(1) | (depuis C++20) |
|
template
<
std::
input_or_output_iterator
I
>
constexpr I next ( I i, std:: iter_difference_t < I > n ) ; |
(2) | (depuis C++20) |
|
template
<
std::
input_or_output_iterator
I,
std::
sentinel_for
<
I
>
S
>
constexpr I next ( I i, S bound ) ; |
(3) | (depuis C++20) |
|
template
<
std::
input_or_output_iterator
I,
std::
sentinel_for
<
I
>
S
>
constexpr I next ( I i, std:: iter_difference_t < I > n, S bound ) ; |
(4) | (depuis C++20) |
Retourne le n ème successeur de l'itérateur i .
Les entités de type fonction décrites sur cette page sont des objets fonction d'algorithmes (informellement appelés niebloids ), c'est-à-dire :
- Les listes d'arguments de modèle explicites ne peuvent pas être spécifiées lors de l'appel de l'une d'entre elles.
- Aucune d'entre elles n'est visible pour la recherche dépendante des arguments .
- Lorsque l'une d'entre elles est trouvée par la recherche non qualifiée normale comme nom à gauche de l'opérateur d'appel de fonction, la recherche dépendante des arguments est inhibée.
Table des matières |
Paramètres
| i | - | un itérateur |
| n | - | nombre d'éléments à avancer |
| bound | - | sentinelle désignant la fin de la plage i pointe vers |
Valeur de retour
Complexité
I
et
S
modélisent à la fois
std::
random_access_iterator
<
I
>
et
std::
sized_sentinel_for
<
S, I
>
, ou si
I
et
S
modélisent
std::
assignable_from
<
I
&
, S
>
; sinon linéaire.
I
et
S
modélisent tous deux
std::
random_access_iterator
<
I
>
et
std::
sized_sentinel_for
<
S, I
>
; sinon linéaire.
Implémentation possible
struct next_fn { template<std::input_or_output_iterator I> constexpr I operator()(I i) const { ++i; return i; } template<std::input_or_output_iterator I> constexpr I operator()(I i, std::iter_difference_t<I> n) const { ranges::advance(i, n); return i; } template<std::input_or_output_iterator I, std::sentinel_for<I> S> constexpr I operator()(I i, S bound) const { ranges::advance(i, bound); return i; } template<std::input_or_output_iterator I, std::sentinel_for<I> S> constexpr I operator()(I i, std::iter_difference_t<I> n, S bound) const { ranges::advance(i, n, bound); return i; } }; inline constexpr auto next = next_fn(); |
Notes
Bien que l'expression
++
x.
begin
(
)
compile souvent, rien ne garantit qu'elle le fasse :
x.
begin
(
)
est une expression rvalue, et aucune exigence ne spécifie que l'incrément d'une rvalue est garanti de fonctionner. En particulier, lorsque les itérateurs sont implémentés comme des pointeurs ou que leur
operator++
est qualifié de référence lvalue,
++
x.
begin
(
)
ne compile pas, tandis que
ranges
::
next
(
x.
begin
(
)
)
le fait.
Exemple
#include <cassert> #include <iterator> int main() { auto v = {3, 1, 4}; { auto n = std::ranges::next(v.begin()); assert(*n == 1); } { auto n = std::ranges::next(v.begin(), 2); assert(*n == 4); } { auto n = std::ranges::next(v.begin(), v.end()); assert(n == v.end()); } { auto n = std::ranges::next(v.begin(), 42, v.end()); assert(n == v.end()); } }
Voir aussi
|
(C++20)
|
décrémente un itérateur d'une distance donnée ou jusqu'à une limite
(objet fonction algorithme) |
|
(C++20)
|
avance un itérateur d'une distance donnée ou jusqu'à une limite donnée
(objet fonction algorithme) |
|
(C++11)
|
incrémente un itérateur
(modèle de fonction) |