Namespaces
Variants

std::ranges:: prev

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>
Signature d'appel
template < std:: bidirectional_iterator I >
constexpr I prev ( I i ) ;
(1) (depuis C++20)
template < std:: bidirectional_iterator I >
constexpr I prev ( I i, std:: iter_difference_t < I > n ) ;
(2) (depuis C++20)
template < std:: bidirectional_iterator I >
constexpr I prev ( I i, std:: iter_difference_t < I > n, I bound ) ;
(3) (depuis C++20)

Retourne le n ème prédécesseur 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 :

Table des matières

Paramètres

i - un itérateur
n - nombre d'éléments i doit être descendu
bound - itérateur désignant le début de la plage i pointe vers

Valeur de retour

1) Le prédécesseur de i .
2) Le n ème prédécesseur de l'itérateur i .
3) Le n ème prédécesseur de l'itérateur i , ou le premier itérateur qui compare égal à bound , selon celui qui vient en premier.

Complexité

1) Constante.
2,3) Constant si I modélise std:: random_access_iterator < I > ; sinon linéaire.

Implémentation possible

struct prev_fn
{
    template<std::bidirectional_iterator I>
    constexpr I operator()(I i) const
    {
        --i;
        return i;
    }
    template<std::bidirectional_iterator I>
    constexpr I operator()(I i, std::iter_difference_t<I> n) const
    {
        ranges::advance(i, -n);
        return i;
    }
    template<std::bidirectional_iterator I>
    constexpr I operator()(I i, std::iter_difference_t<I> n, I bound) const
    {
        ranges::advance(i, -n, bound);
        return i;
    }
};
inline constexpr auto prev = prev_fn();

Notes

Bien que l'expression -- r. end ( ) compile souvent pour les conteneurs, cela n'est pas garanti : r. end ( ) est une expression rvalue, et il n'existe aucune exigence sur les itérateurs spécifiant que le décré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, -- r. end ( ) ne compile pas, tandis que ranges :: prev ( r. end ( ) ) le fait.

Ceci est encore exacerbé par les plages qui ne modélisent pas ranges:: common_range . Par exemple, pour certaines plages sous-jacentes, ranges :: transform_view :: end n'a pas le même type de retour que ranges :: transform_view :: begin , et donc -- r. end ( ) ne compilera pas. Ce n'est pas quelque chose que ranges::prev peut aider à résoudre, mais il existe des solutions de contournement.

Exemple

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

Sortie :

1
3

Voir aussi

incrémente un itérateur d'une distance donnée ou jusqu'à une limite
(objet fonction algorithme)
avance un itérateur d'une distance donnée ou jusqu'à une limite donnée
(objet fonction algorithme)
(C++11)
décrémente un itérateur
(fonction template)