Namespaces
Variants

std::rotate

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les plages (C++20)
Algorithmes contraints, par ex. ranges::copy, ranges::sort, ...
Opérations séquentielles non modifiantes    
Opérations par lots
(C++17)
Opérations de recherche
Opérations séquentielles modifiantes
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 plages partitionnées)
Opérations d'ensemble (sur des plages triées)
Opérations de fusion (sur des plages triées)
Opérations de tas
Opérations 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 ForwardIt >
ForwardIt rotate( ForwardIt first, ForwardIt middle, ForwardIt last );
(1) (constexpr depuis C++20)
template< class ExecutionPolicy, class ForwardIt >
ForwardIt rotate( ExecutionPolicy&& policy,
                  ForwardIt first, ForwardIt middle, ForwardIt last );
(2) (depuis C++17)
1) Effectue une rotation à gauche sur une plage d'éléments.
Plus précisément, std::rotate échange les éléments de la plage [firstlast) de telle sorte que les éléments dans [firstmiddle) soient placés après les éléments dans [middlelast) tandis que l'ordre des éléments dans les deux plages est conservé.
2) Identique à (1), mais exécuté selon policy.
Cette surcharge participe à la résolution de surcharge uniquement 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 l'une des conditions suivantes est satisfaite, le comportement est indéfini :

  • [firstmiddle) ou [middlelast) n'est pas une plage valide.
(jusqu'à C++11)
(depuis C++11)

Paramètres

first, last - la paire d'itérateurs définissant la plage d'éléments à faire pivoter
middle - l'élément qui doit apparaître au début de la plage pivotée
policy - la politique d'exécution à utiliser
Exigences de type
-
ForwardIt doit satisfaire aux exigences de LegacyForwardIterator .

Valeur de retour

L'itérateur vers l'élément initialement référencé par * first , c'est-à-dire le std:: distance ( middle, last ) ème itérateur suivant de first .

Complexité

Au maximum std:: distance ( first, last ) é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 ForwardIt>
constexpr // depuis C++20
ForwardIt rotate(ForwardIt first, ForwardIt middle, ForwardIt last)
{
    if (first == middle)
        return last;
    if (middle == last)
        return first;
    ForwardIt write = first;
    ForwardIt next_read = first; // position de lecture lorsque "read" atteint "last"
    for (ForwardIt read = middle; read != last; ++write, ++read)
    {
        if (write == next_read)
            next_read = read; // suivre où "first" est allé
        std::iter_swap(write, read);
    }
    // faire pivoter la séquence restante en place
    rotate(write, next_read, last);
    return write;
}

Notes

std::rotate offre une meilleure efficacité sur les implémentations courantes si ForwardIt satisfait LegacyBidirectionalIterator ou (encore mieux) LegacyRandomAccessIterator .

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

std::rotate est un composant courant dans de nombreux algorithmes. Cet exemple démontre le tri par insertion .

#include <algorithm>
#include <iostream>
#include <vector>
auto print = [](const auto remark, const auto& v)
{
    std::cout << remark;
    for (auto n : v)
        std::cout << n << ' ';
    std::cout << '\n';
};
int main()
{
    std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1};
    print("before sort:\t\t", v);
    // insertion sort
    for (auto i = v.begin(); i != v.end(); ++i)
        std::rotate(std::upper_bound(v.begin(), i, *i), i, i + 1);
    print("after sort:\t\t", v);
    // simple rotation to the left
    std::rotate(v.begin(), v.begin() + 1, v.end());
    print("simple rotate left:\t", v);
    // simple rotation to the right
    std::rotate(v.rbegin(), v.rbegin() + 1, v.rend());
    print("simple rotate right:\t", v);
}

Sortie :

before sort:		2 4 2 0 5 10 7 3 7 1
after sort:		0 1 2 2 3 4 5 7 7 10
simple rotate left:	1 2 2 3 4 5 7 7 10 0
simple rotate right:	0 1 2 2 3 4 5 7 7 10

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 488 C++98 la nouvelle position de l'élément pointé par first n'était pas retournée retournée

Voir aussi

copie et effectue une rotation d'une plage d'éléments
(modèle de fonction & objet fonction d'algorithme)
effectue une rotation de l'ordre des éléments dans une plage
(objet fonction d'algorithme)