std::ranges::copy_n, std::ranges::copy_n_result
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> |
(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) |
[
0,
n)
. El comportamiento no está definido si result está dentro del rango [
first,
first + 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:
- Las listas de argumentos de plantilla explícitas no se pueden especificar al llamar a cualquiera de ellas.
- Ninguna de ellas es visible para la búsqueda dependiente de argumentos.
- Cuando alguna de ellas se encuentra mediante la búsqueda normal no calificada como el nombre a la izquierda del operador de llamada a función, se inhibe la búsqueda dependiente de argumentos.
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
(C++20)(C++20) |
Copia un rango de elementos a una nueva ubicación. (niebloid) |
(C++20) |
Copia un rango de elementos en orden inverso. (niebloid) |
(C++20)(C++20) |
Copia un rango de elementos, omitiendo aquellos que satisfacen un criterio específico (niebloid) |
(C++20)(C++20) |
Copia un rango, reemplazando los elementos que satisfacen un criterio específico con otro valor. (niebloid) |
(C++20) |
Crea una copia de un rango que está invertido. (niebloid) |
(C++20) |
Copia y rota un rango de elementos. (niebloid) |
(C++20) |
Crea una copia de algún rango de elementos que no contiene duplicados consecutivos. (niebloid) |
(C++20) |
Mueve un rango de elementos a una nueva ubicación. (niebloid) |
(C++20) |
Mueve un rango de elementos a una nueva ubicación en orden inverso. (niebloid) |
(C++11) |
Copia un número de elementos a una nueva ubicación. (plantilla de función) |