std::ranges:: rotate_copy, std::ranges:: rotate_copy_result
std::ranges
| Non-modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Partitioning operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sorting operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Binary search operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Set operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Heap operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Minimum/maximum operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Permutation operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fold operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operations on uninitialized storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Return types | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Défini dans l'en-tête
<algorithm>
|
||
|
Signature d'appel
|
||
|
template
<
std::
forward_iterator
I,
std::
sentinel_for
<
I
>
S,
std::
weakly_incrementable
O
>
|
(1) | (depuis C++20) |
|
template
<
ranges::
forward_range
R,
std::
weakly_incrementable
O
>
requires
std::
indirectly_copyable
<
ranges::
iterator_t
<
R
>
, O
>
|
(2) | (depuis C++20) |
|
Types auxiliaires
|
||
|
template
<
class
I,
class
O
>
using rotate_copy_result = in_out_result < I, O > ; |
(3) | (depuis C++20) |
Copie la
rotation gauche
de
[
first
,
last
)
vers
result
.
[
first
,
last
)
, de sorte que dans la plage de destination, les éléments de
[
first
,
middle
)
soient placés après les éléments de
[
middle
,
last
)
, tout en préservant l'ordre des éléments dans les deux plages.
[
first
,
middle
)
ou
[
middle
,
last
)
n'est pas un intervalle valide, ou si les intervalles source et destination se chevauchent.
Les entités de type fonction décrites sur cette page sont des objets fonction d'algorithme (informellement appelés niebloids ), c'est-à-dire :
- Les listes d'arguments de template explicites ne peuvent pas être spécifiées lors de l'appel de l'une d'entre elles.
- Aucune d'entre elles n'est visible pour la recherche dépendante des arguments .
- Lorsque l'une d'entre elles est trouvée par la recherche non qualifiée normale comme nom à gauche de l'opérateur d'appel de fonction, la recherche dépendante des arguments est inhibée.
Table des matières |
Paramètres
| first, last | - | la paire itérateur-sentinelle définissant la plage source des éléments à copier |
| r | - | la plage source des éléments à copier |
| middle | - | l'itérateur vers l'élément qui doit apparaître au début de la plage de destination |
| result | - | début de la plage de destination |
Valeur de retour
{ last, result + N } , où N = ranges:: distance ( first, last ) .
Complexité
Linéaire : exactement N affectations.
Notes
Si le type de valeur est
TriviallyCopyable
et que les types d'itérateurs satisfont
contiguous_iterator
, les implémentations de
ranges::rotate_copy
évitent généralement les assignations multiples en utilisant une fonction de "copie en bloc" telle que
std::memmove
.
Implémentation possible
Voir également les implémentations dans libstdc++ et MSVC STL .
struct rotate_copy_fn { template<std::forward_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O> requires std::indirectly_copyable<I, O> constexpr ranges::rotate_copy_result<I, O> operator()(I first, I middle, S last, O result) const { auto c1 {ranges::copy(middle, std::move(last), std::move(result))}; auto c2 {ranges::copy(std::move(first), std::move(middle), std::move(c1.out))}; return {std::move(c1.in), std::move(c2.out)}; } template<ranges::forward_range R, std::weakly_incrementable O> requires std::indirectly_copyable<ranges::iterator_t<R>, O> constexpr ranges::rotate_copy_result<ranges::borrowed_iterator_t<R>, O> operator()(R&& r, ranges::iterator_t<R> middle, O result) const { return (*this)(ranges::begin(r), std::move(middle), ranges::end(r), std::move(result)); } }; inline constexpr rotate_copy_fn rotate_copy {}; |
Exemple
#include <algorithm> #include <iostream> #include <iterator> #include <vector> int main() { std::vector<int> src {1, 2, 3, 4, 5}; std::vector<int> dest(src.size()); auto pivot = std::ranges::find(src, 3); std::ranges::rotate_copy(src, pivot, dest.begin()); for (int i : dest) std::cout << i << ' '; std::cout << '\n'; // copier directement le résultat de la rotation vers std::cout pivot = std::ranges::find(dest, 1); std::ranges::rotate_copy(dest, pivot, std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; }
Sortie :
3 4 5 1 2 1 2 3 4 5
Voir aussi
|
(C++20)
|
fait pivoter l'ordre des éléments dans une plage
(objet fonction algorithme) |
|
(C++20)
(C++20)
|
copie une plage d'éléments vers un nouvel emplacement
(objet fonction algorithme) |
|
copie et fait pivoter une plage d'éléments
(modèle de fonction) |