Namespaces
Variants

std::fill_n

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
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)

Ordenación y operaciones relacionadas
Operaciones de particionado
(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 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:

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)

Si se cumple alguna de las siguientes condiciones, el programa está mal formado:

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 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 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

#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, pero
T no siempre es escribible a OutputIt
se requiere que sea escribible en su lugar
LWG 426 C++98 el requisito de complejidad era “exactamente count
asignaciones”, lo cual está roto si count es negativo
sin asignación si
count 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)
asigna un valor a un número de elementos
(objeto función de algoritmo)