Namespaces
Variants

std::reverse

De fr.cppreference.net
 
 
Bibliothèque d’algorithmes
Algorithmes contraints et algorithmes sur plages (ranges) (C++20)
Algorithmes contraints, p. ex. ranges::copy, ranges::sort, ...
Opérations séquentielles non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations séquentielles modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d’échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de réorganisation
(jusqu’à C++17)(C++11)
(C++20)(C++20)
Opérations d’échantillonnage
(C++17)

Tri et opérations connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche dichotomique
(sur plages partitionnées)
Opérations ensemblistes (sur plages triées)
Opérations de fusion (sur plages triées)
Opérations de tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Défini dans l’en‑tête <algorithm>
template< class BidirIt >
void reverse( BidirIt first, BidirIt last );
(1) (constexpr depuis C++20)
template< class ExecutionPolicy, class BidirIt >
void reverse( ExecutionPolicy&& policy, BidirIt first, BidirIt last );
(2) (depuis C++17)
1) Inverse l’ordre des éléments de la plage [firstlast).
Se comporte comme si on appliquait std::iter_swap à chaque paire d’itérateurs first + i et (last - i) - 1 pour chaque entier i dans [0std::distance(first, last) / 2).
2) Identique à (1), mais exécuté selon policy.
Cette surcharge ne participe à la résolution de surcharge que si la valeur de l’expression suivante est true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(jusqu’à C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(depuis C++20)

Si *first n’est pas Swappable(jusqu’à C++20)BidirIt n’est pas ValueSwappable(depuis C++20), le comportement est indéfini.

Paramètres

first, last - la paire d'itérateurs définissant l'intervalle des éléments à inverser
policy - la politique d'exécution à utiliser
Exigences de type
-
BidirIt doit satisfaire aux exigences de LegacyBidirectionalIterator .

Complexité

Exactement std:: distance ( first, last ) / 2 échanges.

Exceptions

La surcharge avec un paramètre de modèle nommé ExecutionPolicy signale les erreurs comme suit :

  • Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que ExecutionPolicy fait partie des politiques standard , std::terminate est appelé. Pour tout autre ExecutionPolicy , le comportement est défini par l'implémentation.
  • Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.

Implémentation possible

Voir également les implémentations dans libstdc++ , libc++ , et MSVC STL .

template<class BidirIt>
constexpr // depuis C++20
void reverse(BidirIt first, BidirIt last)
{
    using iter_cat = typename std::iterator_traits<BidirIt>::iterator_category;
    // La distribution par étiquette, par exemple en appelant reverse_impl(first, last, iter_cat()),
    // peut être utilisée dans les modes C++14 et antérieurs.
    if constexpr (std::is_base_of_v<std::random_access_iterator_tag, iter_cat>)
    {
        if (first == last)
            return;
        for (--last; first < last; (void)++first, --last)
            std::iter_swap(first, last);
    }
    else
        while (first != last && first != --last)
            std::iter_swap(first++, last);
}

Notes

Les implémentations (par exemple MSVC STL ) peuvent activer la vectorisation lorsque le type d'itérateur satisfait LegacyContiguousIterator et que l'échange de son type de valeur n'appelle ni fonction membre spéciale non triviale ni ADL -trouvée swap .

Exemple

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
void println(auto rem, auto const& v)
{
    for (std::cout << rem; auto e : v)
        std::cout << e << ' ';
    std::cout << '\n';
}
int main()
{
    std::vector<int> v {1, 2, 3};
    std::reverse(v.begin(), v.end());
    println("after reverse, v = ", v);
    int a[] = {4, 5, 6, 7};
    std::reverse(std::begin(a), std::end(a));
    println("after reverse, a = ", a);
}

Sortie :

after reverse, v = 3 2 1
after reverse, a = 7 6 5 4

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 223 C++98 std::swap était appliqué à chaque paire d'itérateurs applique std::iter_swap à la place
LWG 2039 C++98 std::iter_swap était aussi appliqué quand i
égale std:: distance ( first, last ) / 2
non appliqué

Voir aussi

crée une copie d'une plage inversée
(modèle de fonction & objet fonction d'algorithme)
inverse l'ordre des éléments d'une plage
(objet fonction d'algorithme)