Namespaces
Variants

std::ranges::reverse_copy, std::ranges::reverse_copy_result

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (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 changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Opérations de tri et assimilées
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur plages partitionnées)
Opérations d'ensemble (sur plages triées)
Opérations de fusion (sur plages triées)
Opérations sur les tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations séquentielles non modificatrices
Opérations séquentielles modificatrices
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur plages triées)
       
       
Opérations d'ensemble (sur plages triées)
Opérations sur les tas
Opérations de minimum/maximum
       
       
Opérations de permutation
Opérations de pliage (fold)
Opérations sur la mémoire non initialisée
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
template< std::bidirectional_iterator I, std::sentinel_for<I> S,
          std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr reverse_copy_result<I, O>
    reverse_copy( I first, S last, O result );
(1) (depuis C++20)
template< ranges::bidirectional_range R, std::weakly_incrementable O >
requires std::indirectly_copyable<ranges::iterator_t<R>, O>
constexpr reverse_copy_result<ranges::borrowed_iterator_t<R>, O>
    reverse_copy( R&& r, O result );
(2) (depuis C++20)
Types d'aide
template< class I, class O >
using reverse_copy_result = ranges::in_out_result<I, O>;
(3) (depuis C++20)
1) Copie les éléments de la plage source [firstlast) vers la plage de destination [resultresult + N), où N est ranges::distance(first, last), de telle sorte que les éléments de la nouvelle plage soient dans l'ordre inverse. Se comporte comme si l'affectation *(result + N - 1 - i) = *(first + i) était exécutée une fois pour chaque entier i dans [0N). Le comportement est indéfini si les plages source et destination se chevauchent.
2) Identique à (1), mais utilise r comme plage source, comme si ranges::begin(r) était utilisé comme first et ranges::end(r) comme last.

Les entités de type fonction décrites sur cette page sont des objets fonctions d'algorithme (informellement appelés niebloids), c'est-à-dire :

Paramètres

first, last - la paire itérateur-sentinelle définissant la plage source des éléments à copier
r - la plage source des éléments à copier
result - le début de la plage de destination.

Valeur de retour

{ dernier, résultat + N } .

Complexité

Exactement N affectations.

Notes

Les implémentations (par ex. MSVC STL ) peuvent activer la vectorisation lorsque les deux types d'itérateurs modélisent contiguous_iterator et ont le même type de valeur, et que le type de valeur est TriviallyCopyable .

Implémentation possible

Voir aussi les implémentations dans MSVC STL et libstdc++ .

struct reverse_copy_fn
{
    template<std::bidirectional_iterator I, std::sentinel_for<I> S,
             std::weakly_incrementable O>
    requires std::indirectly_copyable<I, O>
    constexpr ranges::reverse_copy_result<I, O>
        operator()(I first, S last, O result) const
    {
        auto ret = ranges::next(first, last);
        for (; last != first; *result = *--last, ++result);
        return {std::move(ret), std::move(result)};
    }
    template<ranges::bidirectional_range R, std::weakly_incrementable O>
    requires std::indirectly_copyable<ranges::iterator_t<R>, O>
    constexpr ranges::reverse_copy_result<ranges::borrowed_iterator_t<R>, O>
        operator()(R&& r, O result) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(result));
    }
};
inline constexpr reverse_copy_fn reverse_copy {};

Exemple

#include <algorithm>
#include <iostream>
#include <string>
int main()
{
    std::string x {"12345"}, y(x.size(), ' ');
    std::cout << x << " → ";
    std::ranges::reverse_copy(x.begin(), x.end(), y.begin());
    std::cout << y << " → ";
    std::ranges::reverse_copy(y, x.begin());
    std::cout << x << '\n';
}

Sortie :

12345 → 54321 → 12345

Voir aussi

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