Namespaces
Variants

std::ranges::rotate_copy, std::ranges::rotate_copy_result

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les ranges (C++20)
Algorithmes contraints, e.g. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence 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 connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des ranges partitionnés)
Opérations d'ensemble (sur des ranges triés)
Opérations de fusion (sur des ranges triés)
Opérations de tas
Opérations min/max
(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 de séquence non modificatrices
Opérations de séquence modificatrices
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur des ranges triés)
       
       
Opérations d'ensemble (sur des ranges triés)
Opérations de tas
Opérations min/max
       
       
Opérations de permutation
Opérations de pliage
Opérations sur le stockage non initialisé
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
template< std::forward_iterator I, std::sentinel_for<I> S,
          std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr rotate_copy_result<I, O>
    rotate_copy( I first, I middle, S last, O result );
(1) (depuis C++20)
template< ranges::forward_range R, std::weakly_incrementable O >
requires std::indirectly_copyable<ranges::iterator_t<R>, O>
constexpr rotate_copy_result<ranges::borrowed_iterator_t<R>, O>
    rotate_copy( R&& r, ranges::iterator_t<R> middle, O result );
(2) (depuis C++20)
Types auxiliaires
template< class I, class O >
using rotate_copy_result = in_out_result<I, O>;
(3) (depuis C++20)

Copie la rotation à gauche de [firstlast) vers result.

1) Copie les éléments de la plage source [firstlast), de sorte que dans la plage de destination, les éléments de [firstmiddle) soient placés après les éléments de [middlelast) tout en préservant l'ordre des éléments dans les deux plages.
Le comportement est indéfini si [firstmiddle) ou [middlelast) n'est pas une plage valide, ou 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 foncteurs d'algorithme (informellement appelés niebloïdes), 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
middle - l'itérateur vers l'élément qui doit apparaître au début de la plage de destination
result - début de la plage de destination

Valeur de retour

{ last, result + N } , où N = ranges:: distance ( first, last ) .

Complexité

Linéaire : exactement N affectations.

Notes

Si le type de valeur est TriviallyCopyable et que les types d'itérateurs satisfont contiguous_iterator , les implémentations de ranges::rotate_copy évitent généralement les assignations multiples en utilisant une fonction de "copie en bloc" telle que std::memmove .

Implémentation possible

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

struct rotate_copy_fn
{
    template<std::forward_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O>
    requires std::indirectly_copyable<I, O>
    constexpr ranges::rotate_copy_result<I, O>
        operator()(I first, I middle, S last, O result) const
    {
        auto c1 {ranges::copy(middle, std::move(last), std::move(result))};
        auto c2 {ranges::copy(std::move(first), std::move(middle), std::move(c1.out))};
        return {std::move(c1.in), std::move(c2.out)};
    }
    template<ranges::forward_range R, std::weakly_incrementable O>
    requires std::indirectly_copyable<ranges::iterator_t<R>, O>
    constexpr ranges::rotate_copy_result<ranges::borrowed_iterator_t<R>, O>
        operator()(R&& r, ranges::iterator_t<R> middle, O result) const
    {
        return (*this)(ranges::begin(r), std::move(middle),
                       ranges::end(r), std::move(result));
    }
};
inline constexpr rotate_copy_fn rotate_copy {};

Exemple

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
    std::vector<int> src {1, 2, 3, 4, 5};
    std::vector<int> dest(src.size());
    auto pivot = std::ranges::find(src, 3);
    std::ranges::rotate_copy(src, pivot, dest.begin());
    for (int i : dest)
        std::cout << i << ' ';
    std::cout << '\n';
    // copier directement le résultat de la rotation vers std::cout
    pivot = std::ranges::find(dest, 1);
    std::ranges::rotate_copy(dest, pivot, std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

Sortie :

3 4 5 1 2
1 2 3 4 5

Voir aussi

fait pivoter l'ordre des éléments dans une plage
(objet fonction algorithme)
copie une plage d'éléments vers un nouvel emplacement
(objet fonction algorithme)
copie et fait pivoter une plage d'éléments
(modèle de fonction)