Namespaces
Variants

std::copy_n

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos en 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 secuencias
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 particionamiento
(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


 
Definido en el encabezado <algorithm>
template< class InputIt, class Size, class OutputIt >
OutputIt copy_n( InputIt first, Size count, OutputIt result );
(1) (desde C++11)
(constexpr desde C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class Size, class ForwardIt2 >
ForwardIt2 copy_n( ExecutionPolicy&& policy,
                   ForwardIt1 first, Size count, ForwardIt2 result );
(2) (desde C++17)
1) Copia exactamente count valores del rango que comienza en first al rango que comienza en result. Formalmente, para cada entero i en [0, count), realiza *(result + i) = *(first + i).
La superposición de rangos está formalmente permitida, pero conduce a un orden impredecible de los resultados.
2) Igual que (1), pero ejecutado de acuerdo a policy.
Esta sobrecarga participa en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(hasta C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(desde C++20)

Parámetros

first - el inicio del rango de elementos desde donde copiar
count - número de elementos a copiar
result - el inicio del rango de destino
policy - la política de ejecución a utilizar
Requisitos de tipo
-
InputIt debe cumplir los requisitos de LegacyInputIterator.
-
OutputIt debe cumplir los requisitos de LegacyOutputIterator.
-
ForwardIt1, ForwardIt2 debe cumplir los requisitos de LegacyForwardIterator.

Valor de retorno

Iterador en el rango de destino, apuntando más allá del último elemento copiado si count > 0 o result en caso contrario.

Complejidad

Cero asignaciones si count < 0; count asignaciones en caso contrario.

Excepciones

La sobrecarga con un parámetro de plantilla llamado ExecutionPolicy informa errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es una de las políticas estándar, se llama a std::terminate. Para cualquier otro ExecutionPolicy, el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.

Posible implementación

template<class InputIt, class Size, class OutputIt>
constexpr //< since C++20
OutputIt copy_n(InputIt first, Size count, OutputIt result)
{
    if (count > 0)
    {
        *result = *first;
        ++result;
        for (Size i = 1; i != count; ++i, (void)++result)
            *result = *++first;
    }
    
    return result;
}

Ejemplo

#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <string>
#include <vector>

int main()
{
    std::string in {"1234567890"};
    std::string out;
    
    std::copy_n(in.begin(), 4, std::back_inserter(out));
    std::cout << out << '\n';
    
    std::vector<int> v_in(128);
    std::iota(v_in.begin(), v_in.end(), 1);
    std::vector<int> v_out(v_in.size());
    
    std::copy_n(v_in.cbegin(), 100, v_out.begin());
    std::cout << std::accumulate(v_out.begin(), v_out.end(), 0) << '\n';
}

Salida:

1234
5050

Véase también

copia un rango de elementos a una nueva ubicación
(plantilla de función & objeto función de algoritmo)
copia un número de elementos a una nueva ubicación
(objeto función de algoritmo)