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)
Definido en el encabezado <iterator>
template < class InputIt >
InputIt next ( InputIt it, typename std:: iterator_traits < InputIt > :: difference_type n = 1 ) ;
(desde C++11)
(hasta C++17)
template < class InputIt >

constexpr

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

Devuelve el n ésimo sucesor (o - n ésimo predecesor si n es negativo) del iterador it .

Contenidos

Parámetros

it - un iterador
n - número de elementos a avanzar
Requisitos de tipo
-
InputIt debe cumplir con los requisitos de LegacyInputIterator .

Valor de retorno

Un iterador de tipo InputIt que contiene el n ésimo sucesor (o - n ésimo predecesor si n es negativo) del iterador it .

Complejidad

Lineal.

Sin embargo, si InputIt cumple adicionalmente con los requisitos de LegacyRandomAccessIterator , la complejidad es constante.

Implementación posible

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

Notas

Aunque la expresión ++ c. begin ( ) a menudo compila, no está garantizado que lo haga: c. begin ( ) es una expresión rvalue, y no existe un LegacyInputIterator requisito que especifique que el incremento de un rvalue esté garantizado para funcionar. En particular, cuando los iteradores se implementan como punteros o su operator++ está calificado como referencia a lvalue, ++ c. begin ( ) no compila, mientras que std :: next ( c. begin ( ) ) sí lo hace.

Ejemplo

#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';
}

Salida:

4 6
 5

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
LWG 2353 C++11 next requería LegacyForwardIterator LegacyInputIterator permitido

Véase también

(C++11)
decrementa un iterador
(plantilla de función)
avanza un iterador una distancia dada
(plantilla de función)
devuelve la distancia entre dos iteradores
(plantilla de función)
incrementa un iterador una distancia dada o hasta un límite
(objeto función de algoritmo)