Namespaces
Variants

std::ranges::reverse_copy, std::ranges::reverse_copy_result

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)

Operaciones de ordenación y relacionadas
Operaciones de particionado
(C++11)    

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


 
Algoritmos restringidos
Todos los nombres en este menú pertenecen al espacio de nombres std::ranges
Operaciones de secuencia no modificadoras
Operaciones de secuencia modificadoras
Operaciones de particionado
Operaciones de ordenación
Operaciones de búsqueda binaria (en rangos ordenados)
       
       
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montículo (heap)
Operaciones de mínimo/máximo
       
       
Operaciones de permutación
Operaciones de plegado
Operaciones en almacenamiento no inicializado
Tipos de retorno
 
Definido en el encabezado <algorithm>
Firma de llamada
template< std::bidirectional_iterator I, std::sentinel_for<I> S,
          std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr reverse_copy_result<I, O>
    reverse_copy( I first, S last, O result );
(1) (desde C++20)
template< ranges::bidirectional_range R, std::weakly_incrementable O >
requires std::indirectly_copyable<ranges::iterator_t<R>, O>
constexpr reverse_copy_result<ranges::borrowed_iterator_t<R>, O>
    reverse_copy( R&& r, O result );
(2) (desde C++20)
Tipos auxiliares
template< class I, class O >
using reverse_copy_result = ranges::in_out_result<I, O>;
(3) (desde C++20)
1)Copia los elementos del rango de origen [first, last) al rango de destino [result, result + N), donde N es ranges::distance(first, last), de tal manera que los elementos en el nuevo rango están en orden inverso. Se comporta como si se ejecutara la asignación *(result + N - 1 - i) = *(first + i) una vez para cada entero i en [0, N). El comportamiento no está definido si los rangos de origen y destino se superponen.
2)Igual que (1), pero usa r como el rango de origen, como si usara ranges::begin(r) como first y ranges::end(r) como last.

Las entidades similares a funciones descritas en esta página son objetos de función de algoritmo (informalmente conocidos como niebloids), es decir:

Parámetros

first, last - el par iterador-sentinel que define el rango fuente de elementos a copiar
r - el rango fuente de elementos a copiar
result - el inicio del rango destino.

Valor de retorno

{ last, result + N } .

Complejidad

Exactamente N asignaciones.

Notas

Las implementaciones (por ejemplo, MSVC STL ) pueden habilitar la vectorización cuando ambos tipos de iteradores modelan contiguous_iterator y tienen el mismo tipo de valor, y el tipo de valor es TriviallyCopyable .

Implementación posible

Consulte también las implementaciones en MSVC STL y libstdc++ .

struct reverse_copy_fn
{
    template<std::bidirectional_iterator I, std::sentinel_for<I> S,
             std::weakly_incrementable O>
    requires std::indirectly_copyable<I, O>
    constexpr ranges::reverse_copy_result<I, O>
        operator()(I first, S last, O result) const
    {
        auto ret = ranges::next(first, last);
        for (; last != first; *result = *--last, ++result);
        return {std::move(ret), std::move(result)};
    }
    template<ranges::bidirectional_range R, std::weakly_incrementable O>
    requires std::indirectly_copyable<ranges::iterator_t<R>, O>
    constexpr ranges::reverse_copy_result<ranges::borrowed_iterator_t<R>, O>
        operator()(R&& r, O result) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(result));
    }
};
inline constexpr reverse_copy_fn reverse_copy {};

Ejemplo

#include <algorithm>
#include <iostream>
#include <string>
int main()
{
    std::string x {"12345"}, y(x.size(), ' ');
    std::cout << x << " → ";
    std::ranges::reverse_copy(x.begin(), x.end(), y.begin());
    std::cout << y << " → ";
    std::ranges::reverse_copy(y, x.begin());
    std::cout << x << '\n';
}

Salida:

12345 → 54321 → 12345

Véase también

invierte el orden de los elementos en un rango
(objeto función de algoritmo)
crea una copia de un rango que está invertido
(plantilla de función)