std::shift_left, std::shift_right
De fr.cppreference.net
< cpp | algorithme
| 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
idans[0,last - first - n), déplace l'élément initialement à la positionfirst + n + ivers la positionfirst + 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
idans[0,last - first - n), déplace l'élément initialement à la positionfirst + ivers la positionfirst + 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 :
n >= 0n'est pastrue.- Le type de
*firstn'est pas MoveAssignable. - Pour
shift_right,ForwardItn'est ni LegacyBidirectionalIterator ni ValueSwappable.
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.
- Si n est inférieur à std:: distance ( first, last ) , retourne un itérateur égal à std:: next ( first, ( std:: distance ( first, last ) - n ) ) .
- Sinon, retourne first .
3,4)
Le début de la plage résultante.
- Si n est inférieur à std:: distance ( first, last ) , retourne un itérateur égal à std:: next ( first, n ) .
- Sinon, retourne last .
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
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, 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
Exécuter ce code
#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 . . δ ε ζ η .
` 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) |
(C++20) |
|
(C++11) |
déplace une plage d'éléments vers un nouvel emplacement dans l'ordre inverse (gabarit de fonction & objet fonction d'algorithme) |
(C++20) |
|
| fait pivoter l'ordre des éléments d'une plage (gabarit de fonction & objet fonction d'algorithme) | |
(C++20) |
|
(C++23) (C++23) |
décale les éléments d'une plage (objet fonction d'algorithme) |