Namespaces
Variants

std::shift_left, std::shift_right

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 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)

Tri et opérations 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 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 ForwardIt >
constexpr ForwardIt shift_left( ForwardIt first, ForwardIt last,
                                typename std::iterator_traits<ForwardIt>::
                                    difference_type n );
(1) (depuis C++20)
template< class ExecutionPolicy, class ForwardIt >
ForwardIt shift_left( ExecutionPolicy&& policy,
                      ForwardIt first, ForwardIt last,
                      typename std::iterator_traits<ForwardIt>::
                          difference_type n );
(2) (depuis C++20)
template< class ForwardIt >
constexpr ForwardIt shift_right( ForwardIt first, ForwardIt last,
                                 typename std::iterator_traits<ForwardIt>::
                                     difference_type n );
(3) (depuis C++20)
template< class ExecutionPolicy, class ForwardIt >
ForwardIt shift_right( ExecutionPolicy&& policy,
                       ForwardIt first, ForwardIt last,
                       typename std::iterator_traits<ForwardIt>::
                           difference_type n );
(4) (depuis C++20)

Décale les éléments dans la plage [firstlast) de n positions.

1) Décale les éléments vers le début de la plage.
  • Si n == 0 || n >= last - first, il n'y a aucun effet.
  • Sinon, pour chaque entier i dans [0last - first - n), déplace l'élément initialement à la position first + n + i vers la position first + i.
Les déplacements sont effectués dans l'ordre croissant de i en commençant à partir de 0.
3) Décale les éléments vers la fin de la plage.
  • Si n == 0 || n >= last - first, il n'y a aucun effet.
  • Sinon, pour chaque entier i dans [0last - first - n), déplace l'élément initialement à la position first + i vers la position first + n + i.
Si ForwardIt satisfait aux exigences de LegacyBidirectionalIterator, alors les déplacements sont effectués dans l'ordre décroissant de i en commençant à partir de last - first - n - 1.
2,4) Identique à (1) et (3), respectivement, mais exécuté selon policy et les déplacements peuvent être effectués dans n'importe quel ordre.
Ces surcharges participent à la résolution de surcharge seulement si std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> est true.

Les éléments qui se trouvent dans la plage d'origine mais pas dans la nouvelle plage sont laissés dans un état valide mais non spécifié.

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

Paramètres

first, last - la paire d'itérateurs définissant la plage d'éléments à décaler
n - le nombre de positions à décaler
policy - la politique d'exécution à utiliser
Exigences de type
-
ForwardIt doit satisfaire aux exigences de LegacyForwardIterator .

Valeur de retour

1,2) La fin de la plage résultante.
3,4) Le début de la plage résultante.

Complexité

1,2) Au maximum std:: distance ( first, last ) - n affectations.
3,4) Au maximum std:: distance ( first, last ) - n assignations ou échanges.

Exceptions

Les surcharges avec un paramètre de modèle nommé ExecutionPolicy signalent 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é.

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_shift 201806L (C++20) std::shift_left et std::shift_right

Exemple

#include <algorithm>
#include <iostream>
#include <string>
#include <type_traits>
#include <vector>
struct S
{
    int value{0};
    bool specified_state{true};
    S(int v = 0) : value{v} {}
    S(S const& rhs) = default;
    S(S&& rhs) { *this = std::move(rhs); }
    S& operator=(S const& rhs) = default;
    S& operator=(S&& rhs)
    {
        if (this != &rhs)
        {
            value = rhs.value;
            specified_state = rhs.specified_state;
            rhs.specified_state = false;
        }
        return *this;
    }
};
template<typename T>
std::ostream& operator<<(std::ostream& os, std::vector<T> const& v)
{
    for (const auto& s : v)
    {
        if constexpr (std::is_same_v<T, S>)
            s.specified_state ? os << s.value << ' ' : os << ". ";
        else if constexpr (std::is_same_v<T, std::string>)
            os << (s.empty() ? "." : s) << ' ';
        else
            os << s << ' ';
    }
    return os;
}
int main()
{
    std::cout << std::left;
    std::vector<S>           a{1, 2, 3, 4, 5, 6, 7};
    std::vector<int>         b{1, 2, 3, 4, 5, 6, 7};
    std::vector<std::string> c{"α", "β", "γ", "δ", "ε", "ζ", "η"};
    std::cout << "vector<S> \tvector<int> \tvector<string>\n";
    std::cout << a << "  " << b << "  " << c << '\n';
    std::shift_left(begin(a), end(a), 3);
    std::shift_left(begin(b), end(b), 3);
    std::shift_left(begin(c), end(c), 3);
    std::cout << a << "  " << b << "  " << c << '\n';
    std::shift_right(begin(a), end(a), 2);
    std::shift_right(begin(b), end(b), 2);
    std::shift_right(begin(c), end(c), 2);
    std::cout << a << "  " << b << "  " << c << '\n';
    std::shift_left(begin(a), end(a), 8); // n'a aucun effet : n >= last - first
    std::shift_left(begin(b), end(b), 8); // idem
    std::shift_left(begin(c), end(c), 8); // idem
    std::cout << a << "  " << b << "  " << c << '\n';
//  std::shift_left(begin(a), end(a), -3); // UB, par exemple segfault
}

Sortie possible :

vector<S>       vector<int>     vector<string>
1 2 3 4 5 6 7   1 2 3 4 5 6 7   α β γ δ ε ζ η
4 5 6 7 . . .   4 5 6 7 5 6 7   δ ε ζ η . . .
. . 4 5 6 7 .   4 5 4 5 6 7 5   . . δ ε ζ η .
. . 4 5 6 7 .   4 5 4 5 6 7 5   . . δ ε ζ η .
**Note:** Le contenu a été laissé inchangé car : - Les balises HTML et leurs attributs doivent être préservés - Le texte se trouve dans une balise `
` qui ne doit pas être traduite
- Les termes spécifiques au C++ (`vector`, `vector`, `vector`) ne doivent pas être traduits
- Le contenu représente des données de code/de tableau qui doivent rester dans leur format original

Voir aussi

(C++11)
déplace une plage d'éléments vers un nouvel emplacement
(gabarit de fonction & objet fonction d'algorithme)
déplace une plage d'éléments vers un nouvel emplacement dans l'ordre inverse
(gabarit de fonction & objet fonction d'algorithme)
fait pivoter l'ordre des éléments d'une plage
(gabarit de fonction & objet fonction d'algorithme)
décale les éléments d'une plage
(objet fonction d'algorithme)