Namespaces
Variants

std:: prev

From es.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 BidirIt >
BidirIt prev ( BidirIt it, typename std:: iterator_traits < BidirIt > :: difference_type n = 1 ) ;
(desde C++11)
(hasta C++17)
template < class BidirIt >

constexpr

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

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

Contenidos

Parámetros

it - un iterador
n - número de elementos que it debe descender
Requisitos de tipo
-
BidirIt debe cumplir con los requisitos de LegacyBidirectionalIterator .

Valor de retorno

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

Complejidad

Lineal.

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

Implementación posible

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

Notas

Aunque la expresión -- c. end ( ) suele compilar, no está garantizado que lo haga: c. end ( ) es una expresión rvalue, y no existe ningún requisito de iterador que especifique que el decremento de un rvalue esté garantizado para funcionar. En particular, cuando los iteradores se implementan como punteros o su operator -- está calificado como referencia lvalue, -- c. end ( ) no compila, mientras que std :: prev ( c. end ( ) ) sí lo hace.

Ejemplo

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

Salida:

1
4

Véase también

(C++11)
incrementa 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)
decrementa un iterador una distancia dada o hasta un límite
(objeto función de algoritmo)