std::fill_n
De fr.cppreference.net
< cpp | algorithmes
| Défini dans l'en-tête <algorithm>
|
||
template< class OutputIt, class Size, class T >
OutputIt fill_n( OutputIt first, Size count, const T& value );
|
(1) | (jusqu'à C++26) (constexpr depuis 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 );
|
(depuis C++26) | |
template< class ExecutionPolicy,
class ForwardIt, class Size, class T >
ForwardIt fill_n( ExecutionPolicy&& policy,
ForwardIt first, Size count, const T& value );
|
(2) | (depuis C++17) (jusqu'à 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 );
|
(depuis C++26) | |
1) Assigne la valeur donnée
value aux premiers count éléments de la plage commençant à first si count > 0. Ne fait rien sinon.2) Identique à (1), mais exécutée selon
policy. Cette surcharge participe à la résolution de surcharge uniquement si la valeur de l'expression suivante est
true :
|
|
(jusqu'à C++20) |
|
|
(depuis C++20) |
Si l'une des conditions suivantes est satisfaite, le programme est mal formé :
valuen'est pas accessible en écriture versfirst.Sizen'est pas convertible en un type intégral.
Paramètres
| first | - | le début de la plage d'éléments à modifier |
| count | - | nombre d'éléments à modifier |
| value | - | la valeur à assigner |
| policy | - | la politique d'exécution à utiliser |
| Exigences de type | ||
-OutputIt doit satisfaire les exigences de LegacyOutputIterator.
| ||
-ForwardIt doit satisfaire les exigences de LegacyForwardIterator.
| ||
Valeur de retour
Itérateur pointant un élément après le dernier élément assigné si count > 0, first sinon.
Complexité
Exactement std::max(0, count) affectations.
Exceptions
La surcharge avec un paramètre de modèle nommé ExecutionPolicy signale les erreurs comme suit :
- Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que
ExecutionPolicyfait partie des politiques standards, std::terminate est appelé. Pour tout autreExecutionPolicy, le comportement est défini par l'implémentation. - Si l'algorithme échoue à allouer de la mémoire, std::bad_alloc est levé.
Implémentation possible
| 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;
}
|
Notes
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403 |
(C++26) | Initialisation de liste pour les algorithmes (1,2) |
Exemple
Exécuter ce code
#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';
}
Sortie :
-1 -1 -1 -1 -1 5 6 7 8 9
(4,2) (4,2) (4,8)
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 283 | C++98 | T devait être CopyAssignable, maisT n'est pas toujours accessible en écriture à OutputIt
|
exigé d'être accessible en écriture à la place |
| LWG 426 | C++98 | l'exigence de complexité était « exactement countaffectations », ce qui est erroné si count est négatif
|
aucune affectation sicount est non positif
|
| LWG 865 | C++98 | l'emplacement du premier élément suivant la plage de remplissage n'était pas retourné |
retourné |
Voir aussi
| assigne par copie la valeur donnée à chaque élément d'une plage (modèle de fonction & objet fonction d'algorithme) | |
(C++20) |
|
(C++20) |
assigne une valeur à un nombre d'éléments (objet fonction d'algorithme) |