Espacios de nombres
Variantes
Acciones

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

De cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
Biblioteca de algoritmos
Políticas de ejecución (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de partición
Operaciones de ordenación
(C++11)
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mínimo/máximo
(C++11)
(C++17)
Permutaciones
Operaciones numéricas
Bibliotecas C
 
Algoritmos restringidos
Operaciones de secuencia no modificantes
Operaciones de secuencia modificantes
Operaciones en almacenamiento sin inicializar
Operaciones de partición
Operaciones de ordenamiento
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montículo/montón
Operaciones de mínimo/máximo
Permutaciones
 
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.

Contenido

[editar] 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.

[editar] 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).

[editar] Complejidad

Exactamente n asignaciones.

[editar] 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).

[editar] 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 {};

[editar] 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

[editar] 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]