Namespaces
Variants

std:: shift_left, std:: shift_right

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)
shift_left shift_right
(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 >

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 [ first , last ) 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 [ 0 , last - 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 [ 0 , last - first - n ) , déplace l'élément initialement à la position first + i vers la position first + n + i .
Si ForwardIt satisfait aux exigences LegacyBidirectionalIterator , alors les déplacements sont effectués dans l'ordre décroissant de i en commençant par last - first - n - 1 .
2,4) Identique à (1) et (3) , respectivement, mais exécuté selon la 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 :

Table des matières

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
(modèle de fonction)
déplace une plage d'éléments vers un nouvel emplacement dans l'ordre inverse
(modèle de fonction)
fait pivoter l'ordre des éléments dans une plage
(modèle de fonction)
décale les éléments dans une plage
(objet fonction algorithme)