Namespaces
Variants

std::ranges:: copy_n, std::ranges:: copy_n_result

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:: 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 es indefinido si result está dentro del rango [ first , first + n ) (en este caso podría usarse ranges::copy_backward en su lugar).

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

Contenidos

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)