std:: reverse
|
Definido en el encabezado
<algorithm>
|
||
|
template
<
class
BidirIt
>
void reverse ( BidirIt first, BidirIt last ) ; |
(1) | (constexpr desde C++20) |
|
template
<
class
ExecutionPolicy,
class
BidirIt
>
void reverse ( ExecutionPolicy && policy, BidirIt first, BidirIt last ) ; |
(2) | (desde C++17) |
[
first
,
last
)
.
[
0
,
std::
distance
(
first, last
)
/
2
)
.
|
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
*
first
no es
Swappable
(hasta C++20)
BidirIt
no es
ValueSwappable
(desde C++20)
, el comportamiento es indefinido.
Contenidos |
Parámetros
| first, last | - | el par de iteradores que define el rango de elementos a invertir |
| policy | - | la política de ejecución a utilizar |
| Requisitos de tipo | ||
-
BidirIt
debe cumplir con los requisitos de
LegacyBidirectionalIterator
.
|
||
Complejidad
Exactamente std:: distance ( first, last ) / 2 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 BidirIt> constexpr // desde C++20 void reverse(BidirIt first, BidirIt last) { using iter_cat = typename std::iterator_traits<BidirIt>::iterator_category; // Despacho por etiquetas, p.ej. llamando reverse_impl(first, last, iter_cat()), // puede usarse en modos C++14 y anteriores. if constexpr (std::is_base_of_v<std::random_access_iterator_tag, iter_cat>) { if (first == last) return; for (--last; first < last; (void)++first, --last) std::iter_swap(first, last); } else while (first != last && first != --last) std::iter_swap(first++, last); } |
Notas
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
#include <algorithm> #include <iostream> #include <iterator> #include <vector> void println(auto rem, auto const& v) { for (std::cout << rem; auto e : v) std::cout << e << ' '; std::cout << '\n'; } int main() { std::vector<int> v {1, 2, 3}; std::reverse(v.begin(), v.end()); println("after reverse, v = ", v); int a[] = {4, 5, 6, 7}; std::reverse(std::begin(a), std::end(a)); println("after reverse, a = ", a); }
Salida:
after reverse, v = 3 2 1 after reverse, a = 7 6 5 4
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 223 | C++98 | std::swap se aplicaba a cada par de iteradores | aplica std::iter_swap en su lugar |
| LWG 2039 | C++98 |
std::iter_swap
también se aplicaba cuando
i
es igual a std:: distance ( first, last ) / 2 |
no se aplica |
Véase también
|
crea una copia de un rango que está invertido
(function template) |
|
|
(C++20)
|
invierte el orden de los elementos en un rango
(algorithm function object) |