Namespaces
Variants

std::ranges::copy_n, std::ranges::copy_n_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 modificación de secuencia
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 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


 
Algoritmos restringidos
Todos los nombres en este menú pertenecen al espacio de nombres std::ranges
Operaciones de secuencia no modificadoras
Operaciones de modificación de secuencia
Operaciones de particionado
Operaciones de ordenación
Operaciones de búsqueda binaria (en rangos ordenados)
       
       
Operaciones de conjunto (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
       
       
Operaciones de permutación
Operaciones de plegado
Operaciones sobre almacenamiento no inicializado
Tipos de retorno
 
Definido en el encabezado <algorithm>
Firma de llamada
template< std::input_iterator I, std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr copy_n_result<I, O>
    copy_n( I first, std::iter_difference_t<I> n, O result );
(1) (desde C++20)
Tipo auxiliar
template< class I, class O >
using copy_n_result = ranges::in_out_result<I, O>;
(2) (desde C++20)
1) Copia exactamente n valores del rango que comienza en first al rango que comienza en result realizando *(result + i) = *(first + i) para cada entero en [0, n). El comportamiento no está definido si result está dentro del rango [first, first + n) (ranges::copy_backward podría usarse en su lugar en este caso).

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

Parámetros

first - inicio del rango de elementos a copiar
n - número de elementos a copiar
result - inicio del rango de destino

Valor de retorno

ranges :: copy_n_result { first + n, result + n } o más formalmente, un valor de tipo ranges::in_out_result que contiene un iterador input_iterator igual a ranges:: next ( first, n ) y un iterador weakly_incrementable igual a ranges:: next ( result, n ) .

Complejidad

Exactamente n asignaciones.

Notas

En la práctica, las implementaciones de std::ranges::copy_n pueden evitar asignaciones múltiples y utilizar funciones de copia masiva como std::memmove si el tipo de valor es TriviallyCopyable y los tipos de iterador satisfacen contiguous_iterator . Alternativamente, dicha aceleración de copia puede inyectarse durante una fase de optimización de un compilador.

Al copiar rangos superpuestos, std::ranges::copy_n es apropiado al copiar hacia la izquierda (el inicio del rango de destino está fuera del rango fuente) mientras que std::ranges::copy_backward es apropiado al copiar hacia la derecha (el final del rango de destino está fuera del rango fuente).

Implementación posible

struct copy_n_fn
{
    template<std::input_iterator I, std::weakly_incrementable O>
    requires std::indirectly_copyable<I, O>
    constexpr ranges::copy_n_result<I, O>
        operator()(I first, std::iter_difference_t<I> n, O result) const
    {
        for (; n-- > 0; (void)++first, (void)++result)
            *result = *first;
        return {std::move(first), std::move(result)};
    }
};
inline constexpr copy_n_fn copy_n{};

Ejemplo

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <string>
#include <string_view>
int main()
{
    const std::string_view in{"ABCDEFGH"};
    std::string out;
    std::ranges::copy_n(in.begin(), 4, std::back_inserter(out));
    std::cout << std::quoted(out) << '\n';
    out = "abcdefgh";
    const auto res{std::ranges::copy_n(in.begin(), 5, out.begin())};
    const auto i{std::distance(std::begin(in), res.in)};
    const auto j{std::distance(std::begin(out), res.out)};
    std::cout << "in[" << i << "] = '" << in[i] << "'\n"
              << "out[" << j << "] = '" << out[j] << "'\n";
}

Salida:

"ABCD"
in[5] = 'F'
out[5] = 'f'

Véase también

copia un rango de elementos a una nueva ubicación
(objeto función de algoritmo)
copia un rango de elementos en orden inverso
(objeto función de algoritmo)
copia un rango de elementos omitiendo aquellos que cumplen criterios específicos
(objeto función de algoritmo)
copia un rango, reemplazando elementos que cumplen criterios específicos con otro valor
(objeto función de algoritmo)
crea una copia de un rango que está invertido
(objeto función de algoritmo)
copia y rota un rango de elementos
(objeto función de algoritmo)
crea una copia de un rango de elementos que no contiene duplicados consecutivos
(objeto función de algoritmo)
mueve un rango de elementos a una nueva ubicación
(objeto función de algoritmo)
mueve un rango de elementos a una nueva ubicación en orden inverso
(objeto función de algoritmo)
(C++11)
copia un número de elementos a una nueva ubicación
(plantilla de función)