Namespaces
Variants

std::reverse

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p.ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
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)
1) Invierte el orden de los elementos en el rango [first, last).
Se comporta como si aplicara std::iter_swap a cada par de iteradores first + i y (last - i) - 1 para cada entero i en [0, std::distance(first, last) / 2).
2) Igual que (1), pero ejecutado según policy.
Esta sobrecarga participa en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(hasta C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(desde C++20)

Si *first no es Swappable(hasta C++20)BidirIt no es ValueSwappable(desde C++20), el comportamiento no está definido.

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 ExecutionPolicy es uno de los standard policies , std::terminate es llamado. Para cualquier otro ExecutionPolicy , 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 en orden inverso
(plantilla de función & objeto función de algoritmo)
invierte el orden de los elementos en un rango
(objeto función de algoritmo)