Namespaces
Variants

std::ranges:: reverse

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace 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
Definido en el encabezado <algorithm>
Firma de llamada
template < std:: bidirectional_iterator I, std:: sentinel_for < I > S >

requires std:: permutable < I >
constexpr I

reverse ( I first, S last ) ;
(1) (desde C++20)
template < ranges:: bidirectional_range R >

requires std:: permutable < ranges:: iterator_t < R >>
constexpr ranges:: borrowed_iterator_t < R >

reverse ( R && r ) ;
(2) (desde C++20)
1) Invierte el orden de los elementos en el rango [ first , last ) .
Se comporta como si aplicara ranges::iter_swap a cada par de iteradores first + i, last - i - 1 para cada entero i , donde 0 ≤ i < ( last - first ) / 2 .
2) Igual que (1) , pero utiliza r como el rango, como si se usara ranges:: begin ( r ) como first y ranges:: end ( r ) como last .

Las entidades similares a funciones descritas en esta página son algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

Parámetros

first, last - el par iterador-centinela que define el rango de elementos a invertir
r - el rango de elementos a invertir

Valor de retorno

Un iterador igual a last .

Complejidad

Exactamente ( last - first ) / 2 intercambios.

Notas

Las implementaciones (por ejemplo, MSVC STL ) pueden habilitar la vectorización cuando el tipo de iterador modela contiguous_iterator y el intercambio de su tipo de valor no llama ni a funciones miembro especiales no triviales ni a ADL -encontrado swap .

Implementación posible

Vea también implementaciones en libstdc++ y MSVC STL .

struct reverse_fn
{
    template<std::bidirectional_iterator I, std::sentinel_for<I> S>
    requires std::permutable<I>
    constexpr I operator()(I first, S last) const
    {
        auto last2 {ranges::next(first, last)};
        for (auto tail {last2}; !(first == tail or first == --tail); ++first)
            ranges::iter_swap(first, tail);
        return last2;
    }
    template<ranges::bidirectional_range R>
    requires std::permutable<ranges::iterator_t<R>>
    constexpr ranges::borrowed_iterator_t<R>
        operator()(R&& r) const
    {
        return (*this)(ranges::begin(r), ranges::end(r));
    }
};
inline constexpr reverse_fn reverse {};

Ejemplo

#include <algorithm>
#include <array>
#include <iostream>
#include <string>
int main()
{
    std::string s {"ABCDEF"};
    std::cout << s << " → ";
    std::ranges::reverse(s.begin(), s.end());
    std::cout << s << " → ";
    std::ranges::reverse(s);
    std::cout << s << " │ ";
    std::array a {1, 2, 3, 4, 5};
    for (auto e : a)
        std::cout << e << ' ';
    std::cout << "→ ";
    std::ranges::reverse(a);
    for (auto e : a)
        std::cout << e << ' ';
    std::cout << '\n';
}

Salida:

ABCDEF → FEDCBA → ABCDEF │ 1 2 3 4 5 → 5 4 3 2 1

Véase también

crea una copia de un rango que está invertido
(objeto función de algoritmo)
una view que itera sobre los elementos de otra vista bidireccional en orden inverso
(plantilla de clase) (objeto adaptador de rango)
invierte el orden de los elementos en un rango
(plantilla de función)