std::fill_n
De es.cppreference.net
| Definido en el encabezado <algorithm>
|
||
template< class OutputIt, class Size, class T >
OutputIt fill_n( OutputIt first, Size count, const T& value );
|
(1) | (hasta C++26) (constexpr desde C++20) |
template< class OutputIt, class Size,
class T = typename std::iterator_traits
<OutputIt>::value_type >
constexpr OutputIt fill_n( OutputIt first, Size count,
const T& value );
|
(desde C++26) | |
template< class ExecutionPolicy,
class ForwardIt, class Size, class T >
ForwardIt fill_n( ExecutionPolicy&& policy,
ForwardIt first, Size count, const T& value );
|
(2) | (desde C++17) (hasta C++26) |
template< class ExecutionPolicy,
class ForwardIt, class Size,
class T = typename std::iterator_traits
<OutputIt>::value_type >
ForwardIt fill_n( ExecutionPolicy&& policy,
ForwardIt first, Size count, const T& value );
|
(desde C++26) | |
1) Asigna el valor dado
value a los primeros count elementos en el rango que comienza en first si count > 0. No hace nada en caso contrario.2) Igual que (1), pero ejecutado según
policy. Esta sobrecarga participa en la resolución de sobrecarga solo si el valor de la siguiente expresión es
true:
|
|
(hasta C++20) |
|
|
(desde C++20) |
Si se cumple alguna de las siguientes condiciones, el programa está mal formado:
valueno es escribible afirst.Sizeno es convertible a un tipo integral.
Parámetros
| first | - | el comienzo del rango de elementos a modificar |
| count | - | número de elementos a modificar |
| value | - | el valor a asignar |
| policy | - | la política de ejecución a utilizar |
| Requisitos de tipo | ||
-OutputIt debe cumplir los requisitos de LegacyOutputIterator.
| ||
-ForwardIt debe cumplir los requisitos de LegacyForwardIterator.
| ||
Valor de retorno
Iterador uno más allá del último elemento asignado si count > 0, first en caso contrario.
Complejidad
Exactamente std::max(0, count) asignaciones.
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
ExecutionPolicyes una de las políticas estándar, se llama a std::terminate. Para cualquier otroExecutionPolicy, el comportamiento está definido por la implementación. - Si el algoritmo no puede asignar memoria, se lanza std::bad_alloc.
Posible implementación
| fill_n |
|---|
template<class OutputIt, class Size,
class T = typename std::iterator_traits<OutputIt>::value_type>
OutputIt fill_n(OutputIt first, Size count, const T& value)
{
for (Size i = 0; i < count; i++)
*first++ = value;
return first;
}
|
Notas
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403 |
(C++26) | Inicialización con lista para algoritmos (1,2) |
Ejemplo
Ejecutar este código
#include <algorithm>
#include <complex>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
// replace values of the first 5 elements with -1
std::fill_n(v1.begin(), 5, -1);
std::copy_n(v1.cbegin(), v1.size(), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
std::vector<std::complex<double>> nums{{1, 3}, {2, 2}, {4, 8}};
#ifdef __cpp_lib_algorithm_default_value_type
std::fill_n(nums.begin(), 2, {4, 2});
#else
std::fill_n(nums.begin(), 2, std::complex<double>{4, 2});
#endif
std::copy_n(nums.cbegin(), nums.size(),
std::ostream_iterator<std::complex<double>>(std::cout, " "));
std::cout << '\n';
}
Salida:
-1 -1 -1 -1 -1 5 6 7 8 9
(4,2) (4,2) (4,8)
Informes de defectos
Los siguientes informes de defectos que cambian el comportamiento se aplicaron retroactivamente a los estándares C++ previamente publicados.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 283 | C++98 | T se requería que fuera CopyAssignable, peroT no siempre es escribible a OutputIt
|
se requiere que sea escribible en su lugar |
| LWG 426 | C++98 | el requisito de complejidad era “exactamente countasignaciones”, lo cual está roto si count es negativo
|
sin asignación sicount no es positivo
|
| LWG 865 | C++98 | la ubicación del primer elemento después del rango de llenado no se devolvía |
se devuelve |
Véase también
| asigna por copia el valor dado a cada elemento en un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++20) |
asigna un valor a un número de elementos (objeto función de algoritmo) |