◐ Shell
clean mode source ↗

std::ranges::copy_n, std::ranges::copy_n_result - cppreference.com

De cppreference.com

Definido en el archivo de encabezado <algorithm>

Signatura de la 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)

Tipos auxiliares

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 [0n). El comportamiento no está definido si result está dentro del rango [firstfirst + n) (ranges::copy_backward podría usarse en su lugar en este caso).

Las entidades similares a funciones descritas en esta página son niebloids, es decir:

En la práctica, pueden implementarse como objetos función o con extensiones de compilador especiales.

Parámetros

first - El inicio del rango de elementos del cual copiar.
n - El número de elementos a copiar.
result - El 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 std::input_iterator igual a ranges::next(first, n) y un iterador std::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 usar funciones de copia masiva como std::memmove si el tipo valor es TriviallyCopyable y los tipos iterador satisfacen contiguous_iterator. Alternativamente, dicha aceleración de copia se puede inyectar durante una fase de optimización de un compilador.

Al copiar rangos superpuestos, std::ranges::copy_n es apropiado cuando se copia a la izquierda (el comienzo del rango de destino está fuera del rango de origen) mientras que std::ranges::copy_backward es apropiado cuando se copia a la derecha (el final del rango de destino está fuera del rango de origen).

Posible implementación

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 (std::iter_difference_t<I> i {}; i != n; ++i, ++first, ++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());
    std::cout
        << "*(res.in): '" << *(res.in) << "', distancia: "
        << std::distance(std::begin(in), res.in) << '\n'
        << "*(res.out): '" << *(res.out) << "', distancia: "
        << std::distance(std::begin(out), res.out) << '\n';
}

Salida:

"ABCD"
*(res.in): 'F', distancia: 5
*(res.out): 'f', distancia: 5

Véase también

Copia un rango de elementos a una nueva ubicación.
(niebloid) [editar]
Copia un rango de elementos en orden inverso.
(niebloid) [editar]
Copia un rango de elementos, omitiendo aquellos que satisfacen un criterio específico
(niebloid) [editar]
Copia un rango, reemplazando los elementos que satisfacen un criterio específico con otro valor.
(niebloid) [editar]
Crea una copia de un rango que está invertido.
(niebloid) [editar]
Copia y rota un rango de elementos.
(niebloid) [editar]
Crea una copia de algún rango de elementos que no contiene duplicados consecutivos.
(niebloid) [editar]
Mueve un rango de elementos a una nueva ubicación.
(niebloid) [editar]
Mueve un rango de elementos a una nueva ubicación en orden inverso.
(niebloid) [editar]

(C++11)

Copia un número de elementos a una nueva ubicación.
(plantilla de función) [editar]