[ Web Proxy ]
URL:
Viewing: http://es.cppreference.com/cpp/algorithm/ranges/copy_n [Back]  [Original]

std::ranges::copy_n, std::ranges::copy_n_result - cppreference.com
cppreference.com
Espacios de nombres
Variantes

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

De cppreference.com
 
 
Biblioteca de algoritmos
Polticas de ejecucin (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 particin
Operaciones de ordenacin
(C++11)
Operaciones de bsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mnimo/mximo
(C++11)
(C++17)
Permutaciones
Operaciones numricas
Bibliotecas C
 
Algoritmos restringidos
Operaciones de secuencia no modificantes
Operaciones de secuencia modificantes
Operaciones en almacenamiento sin inicializar
Operaciones de particin
Operaciones de ordenamiento
Operaciones de bsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montculo/montn
Operaciones de mnimo/mximo
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 podra usarse en su lugar en este caso).

Las entidades similares a funciones descritas en esta pgina son niebloids, es decir:

En la prctica, pueden implementarse como objetos funcin o con extensiones de compilador especiales.

Parmetros

first - El inicio del rango de elementos del cual copiar.
n - El nmero de elementos a copiar.
result - El inicio del rango de destino.

Valor de retorno

ranges::copy_n_result{first + n, result + n} o, ms 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 prctica, las implementaciones de std::ranges::copy_n pueden evitar asignaciones mltiples y usar funciones de copia masiva como std::memmove si el tipo valor es TriviallyCopyable y los tipos iterador satisfacen contiguous_iterator. Alternativamente, dicha aceleracin de copia se puede inyectar durante una fase de optimizacin 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 implementacin

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

Vase tambin

Copia un rango de elementos a una nueva ubicacin.
(niebloid) [editar]
Copia un rango de elementos en orden inverso.
(niebloid) [editar]
Copia un rango de elementos, omitiendo aquellos que satisfacen un criterio especfico
(niebloid) [editar]
Copia un rango, reemplazando los elementos que satisfacen un criterio especfico 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 algn rango de elementos que no contiene duplicados consecutivos.
(niebloid) [editar]
Mueve un rango de elementos a una nueva ubicacin.
(niebloid) [editar]
Mueve un rango de elementos a una nueva ubicacin en orden inverso.
(niebloid) [editar]
(C++11)
Copia un nmero de elementos a una nueva ubicacin.
(plantilla de funcin) [editar]

Web Proxy Viewer  |  New URL  |  Original Page