std::ranges::copy_n, std::ranges::copy_n_result
| Definido en el encabezado <algorithm>
|
||
| Firma de 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) |
| Tipo auxiliar |
||
template< class I, class O >
using copy_n_result = ranges::in_out_result<I, O>;
|
(2) | (desde C++20) |
n valores del rango que comienza en first al rango que comienza en result realizando *(result + i) = *(first + i) para cada entero en [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 objetos función de algoritmo (conocidos informalmente como niebloides), es decir:
- No se pueden especificar listas explícitas de argumentos de plantilla al llamar a cualquiera de ellos.
- Ninguno de ellos es visible para la búsqueda dependiente de argumentos.
- Cuando cualquiera de ellos se encuentra mediante búsqueda no calificada normal como el nombre a la izquierda del operador de llamada a función, la búsqueda dependiente de argumentos se inhibe.
Parámetros
| first | - | inicio del rango de elementos a copiar |
| n | - | número de elementos a copiar |
| result | - | 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
input_iterator
igual a
ranges::
next
(
first, n
)
y un iterador
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 utilizar funciones de copia masiva como
std::memmove
si el tipo de valor es
TriviallyCopyable
y los tipos de iterador satisfacen
contiguous_iterator
. Alternativamente, dicha aceleración de copia puede inyectarse durante una fase de optimización de un compilador.
Al copiar rangos superpuestos,
std::ranges::copy_n
es apropiado al copiar hacia la izquierda (el inicio del rango de destino está fuera del rango fuente) mientras que
std::ranges::copy_backward
es apropiado al copiar hacia la derecha (el final del rango de destino está fuera del rango fuente).
Implementación posible
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 (; n-- > 0; (void)++first, (void)++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())}; const auto i{std::distance(std::begin(in), res.in)}; const auto j{std::distance(std::begin(out), res.out)}; std::cout << "in[" << i << "] = '" << in[i] << "'\n" << "out[" << j << "] = '" << out[j] << "'\n"; }
Salida:
"ABCD" in[5] = 'F' out[5] = 'f'
Véase también
|
(C++20)
(C++20)
|
copia un rango de elementos a una nueva ubicación
(objeto función de algoritmo) |
|
(C++20)
|
copia un rango de elementos en orden inverso
(objeto función de algoritmo) |
|
(C++20)
(C++20)
|
copia un rango de elementos omitiendo aquellos que cumplen criterios específicos
(objeto función de algoritmo) |
|
(C++20)
(C++20)
|
copia un rango, reemplazando elementos que cumplen criterios específicos con otro valor
(objeto función de algoritmo) |
|
(C++20)
|
crea una copia de un rango que está invertido
(objeto función de algoritmo) |
|
(C++20)
|
copia y rota un rango de elementos
(objeto función de algoritmo) |
|
(C++20)
|
crea una copia de un rango de elementos que no contiene duplicados consecutivos
(objeto función de algoritmo) |
|
(C++20)
|
mueve un rango de elementos a una nueva ubicación
(objeto función de algoritmo) |
|
(C++20)
|
mueve un rango de elementos a una nueva ubicación en orden inverso
(objeto función de algoritmo) |
|
(C++11)
|
copia un número de elementos a una nueva ubicación
(plantilla de función) |