Namespaces
Variants

std:: next

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
Défini dans l'en-tête <iterator>
template < class InputIt >
InputIt next ( InputIt it, typename std:: iterator_traits < InputIt > :: difference_type n = 1 ) ;
(depuis C++11)
(jusqu'à C++17)
template < class InputIt >

constexpr

InputIt next ( InputIt it, typename std:: iterator_traits < InputIt > :: difference_type n = 1 ) ;
(depuis C++17)

Retourne le n ème successeur (ou le - n ème prédécesseur si n est négatif) de l'itérateur it .

Table des matières

Paramètres

it - un itérateur
n - nombre d'éléments à avancer
Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator .

Valeur de retour

Un itérateur de type InputIt qui contient le n ème successeur (ou le - n ème prédécesseur si n est négatif) de l'itérateur it .

Complexité

Linéaire.

Cependant, si InputIt satisfait également aux exigences de LegacyRandomAccessIterator , la complexité est constante.

Implémentation possible

template<class InputIt>
constexpr // depuis C++17
InputIt next(InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1)
{
    std::advance(it, n);
    return it;
}

Notes

Bien que l'expression ++ c. begin ( ) compile souvent, elle n'est pas garantie de le faire : c. begin ( ) est une expression rvalue, et il n'existe aucune exigence LegacyInputIterator qui 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, ++ c. begin ( ) ne compile pas, tandis que std :: next ( c. begin ( ) ) le fait.

Exemple

#include <iostream>
#include <iterator>
#include <vector>
int main()
{
    std::vector<int> v{4, 5, 6};
    auto it = v.begin();
    auto nx = std::next(it, 2);
    std::cout << *it << ' ' << *nx << '\n';
    it = v.end();
    nx = std::next(it, -2);
    std::cout << ' ' << *nx << '\n';
}

Sortie :

4 6
 5

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 Appliqué à Comportement publié Comportement corrigé
LWG 2353 C++11 next nécessitait LegacyForwardIterator LegacyInputIterator autorisé

Voir aussi

(C++11)
décrémente un itérateur
(modèle de fonction)
avance un itérateur d'une distance donnée
(modèle de fonction)
retourne la distance entre deux itérateurs
(modèle de fonction)
incrémente un itérateur d'une distance donnée ou jusqu'à une limite
(objet fonction algorithme)