Namespaces
Variants

std:: rotate

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
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 vers la gauche sur une plage d'éléments.
Plus précisément, std::rotate permute les éléments dans l'intervalle [ first , last ) de telle manière que les éléments dans [ first , middle ) sont placés après les éléments dans [ middle , last ) tout en préservant l'ordre des éléments dans les deux intervalles.
2) Identique à (1) , mais exécuté selon la policy .
Cette surcharge participe à la résolution de surcharge uniquement si toutes les conditions suivantes sont satisfaites :

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true .

(jusqu'en C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true .

(depuis C++20)

Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :

(jusqu'à C++11)
(depuis C++11)

Table des matières

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 fait pivoter une plage d'éléments
(modèle de fonction)
fait pivoter l'ordre des éléments dans une plage
(objet fonction algorithme)