std:: shift_left, std:: shift_right
|
Défini dans l'en-tête
<algorithm>
|
||
|
template
<
class
ForwardIt
>
constexpr
ForwardIt shift_left
(
ForwardIt first, ForwardIt last,
|
(1) | (depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt
>
ForwardIt shift_left
(
ExecutionPolicy
&&
policy,
|
(2) | (depuis C++20) |
|
template
<
class
ForwardIt
>
constexpr
ForwardIt shift_right
(
ForwardIt first, ForwardIt last,
|
(3) | (depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt
>
ForwardIt shift_right
(
ExecutionPolicy
&&
policy,
|
(4) | (depuis C++20) |
Décale les éléments dans la plage
[
first
,
last
)
de
n
positions.
- 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 .
i
en commençant à partir de
0
.
- 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 .
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
.
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 >= 0 n'est pas true .
- Le type de * first n'est pas MoveAssignable .
-
Pour
shift_right,ForwardItn'est ni LegacyBidirectionalIterator ni ValueSwappable .
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
- 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 .
- Si n est inférieur à std:: distance ( first, last ) , retourne un itérateur égal à std:: next ( first, n ) .
- Sinon, retourne last .
Complexité
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
#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
(modèle de fonction) |
|
(C++11)
|
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) |