std:: rotate
|
Definido en el encabezado
<algorithm>
|
||
|
template
<
class
ForwardIt
>
ForwardIt rotate ( ForwardIt first, ForwardIt middle, ForwardIt last ) ; |
(1) | (constexpr desde C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt
>
ForwardIt rotate
(
ExecutionPolicy
&&
policy,
|
(2) | (desde C++17) |
std::rotate
intercambia los elementos en el rango
[
first
,
last
)
de tal manera que los elementos en
[
first
,
middle
)
se colocan después de los elementos en
[
middle
,
last
)
mientras se preservan los órdenes de los elementos en ambos rangos.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true . |
(hasta C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true . |
(desde C++20) |
Si se satisface cualquiera de las siguientes condiciones, el comportamiento es indefinido:
-
[first,middle)o[middle,last)no es un rango válido .
|
(hasta C++11) |
|
(desde C++11) |
Contenidos |
Parámetros
| first, last | - | el par de iteradores que define el rango de elementos a rotar |
| middle | - | el elemento que debe aparecer al inicio del rango rotado |
| policy | - | la política de ejecución a utilizar |
| Requisitos de tipo | ||
-
ForwardIt
debe cumplir con los requisitos de
LegacyForwardIterator
.
|
||
Valor de retorno
El iterador al elemento originalmente referenciado por * first , es decir, el std:: distance ( middle, last ) ésimo siguiente iterador de first .
Complejidad
Como máximo std:: distance ( first, last ) intercambios.
Excepciones
La sobrecarga con un parámetro de plantilla llamado
ExecutionPolicy
reporta errores de la siguiente manera:
-
Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y
ExecutionPolicyes uno de los standard policies , std::terminate es llamado. Para cualquier otroExecutionPolicy, el comportamiento está definido por la implementación. - Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.
Implementación posible
Consulte también las implementaciones en libstdc++ , libc++ , y MSVC STL .
template<class ForwardIt> constexpr // desde C++20 ForwardIt rotate(ForwardIt first, ForwardIt middle, ForwardIt last) { if (first == middle) return last; if (middle == last) return first; ForwardIt write = first; ForwardIt next_read = first; // posición de lectura cuando "read" alcanza "last" for (ForwardIt read = middle; read != last; ++write, ++read) { if (write == next_read) next_read = read; // rastrear dónde fue "first" std::iter_swap(write, read); } // rotar la secuencia restante en su lugar rotate(write, next_read, last); return write; } |
Notas
std::rotate
tiene mejor eficiencia en implementaciones comunes si
ForwardIt
satisface
LegacyBidirectionalIterator
o (mejor aún)
LegacyRandomAccessIterator
.
Las implementaciones (por ejemplo,
MSVC STL
) pueden habilitar la vectorización cuando el tipo de iterador satisface
LegacyContiguousIterator
y el intercambio de su tipo de valor no llama ni a funciones miembro especiales no triviales ni a
ADL
-encontrado
swap
.
Ejemplo
std::rotate
es un bloque de construcción común en muchos algoritmos. Este ejemplo demuestra
insertion sort
.
#include <algorithm> #include <iostream> #include <vector> auto print = [](const auto remark, const auto& v) { std::cout << remark; for (auto n : v) std::cout << n << ' '; std::cout << '\n'; }; int main() { std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1}; print("before sort:\t\t", v); // insertion sort for (auto i = v.begin(); i != v.end(); ++i) std::rotate(std::upper_bound(v.begin(), i, *i), i, i + 1); print("after sort:\t\t", v); // simple rotation to the left std::rotate(v.begin(), v.begin() + 1, v.end()); print("simple rotate left:\t", v); // simple rotation to the right std::rotate(v.rbegin(), v.rbegin() + 1, v.rend()); print("simple rotate right:\t", v); }
Salida:
before sort: 2 4 2 0 5 10 7 3 7 1 after sort: 0 1 2 2 3 4 5 7 7 10 simple rotate left: 1 2 2 3 4 5 7 7 10 0 simple rotate right: 0 1 2 2 3 4 5 7 7 10
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 488 | C++98 | la nueva ubicación del elemento apuntado por first no se retornaba | retornado |
Véase también
|
copia y rota un rango de elementos
(plantilla de función) |
|
|
(C++20)
|
rota el orden de elementos en un rango
(objeto función de algoritmo) |