std:: generate_n
|
Défini dans l'en-tête
<algorithm>
|
||
|
template
<
class
OutputIt,
class
Size,
class
Generator
>
OutputIt generate_n ( OutputIt first, Size count, Generator g ) ; |
(1) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
Size,
class
Generator
>
|
(2) | (depuis C++17) |
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true . |
(jusqu'à C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true . |
(depuis C++20) |
Si
Size
n'est pas
convertible
en un
type intégral
, le programme est mal formé.
Table des matières |
Paramètres
| first | - | début de la plage d'éléments à générer | ||||||
| count | - | nombre d'éléments à générer | ||||||
| policy | - | la politique d'exécution à utiliser | ||||||
| g | - |
objet fonction générateur qui sera appelé.
La signature de la fonction doit être équivalente à ce qui suit :
Le type Ret doit être tel qu'un objet de type OutputIt puisse être déréférencé et assigné à une valeur de type Ret . |
||||||
| Exigences de type | ||||||||
-
OutputIt
doit satisfaire aux exigences de
LegacyOutputIterator
.
|
||||||||
-
ForwardIt
doit satisfaire aux exigences de
LegacyForwardIterator
.
|
||||||||
Valeur de retour
Itérateur pointant après le dernier élément assigné si count > 0 , first sinon.
Complexité
Exactement std:: max ( 0 , count ) invocations de g ( ) et assignations.
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 standard , std::terminate est appelé. Pour tout autreExecutionPolicy, le comportement est défini par l'implémentation. - Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.
Implémentation possible
template<class OutputIt, class Size, class Generator> constexpr // depuis C++20 OutputIt generate_n(OutputIt first, Size count, Generator g) { for (Size i = 0; i < count; ++i, ++first) *first = g(); return first; } |
Exemple
#include <algorithm> #include <functional> #include <iostream> #include <iterator> #include <random> int main() { std::mt19937 rng; // construction par défaut, amorcé avec une graine fixe std::generate_n(std::ostream_iterator<std::mt19937::result_type>(std::cout, " "), 5, std::ref(rng)); std::cout << '\n'; }
Sortie :
3499211612 581869302 3890346734 3586334585 545404204
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 | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 426 | C++98 |
l'exigence de complexité était « exactement
count
invocations
ou affectations », ce qui est incorrect si count est négatif |
aucune invocation ni affectation
si count est non positif |
| LWG 865 | C++98 |
la position du premier élément suivant
la plage de génération n'était pas renvoyée |
renvoyée |
Voir aussi
|
assigne par copie la valeur donnée à N éléments dans une plage
(modèle de fonction) |
|
|
assigne les résultats d'appels successifs de fonction à chaque élément d'une plage
(modèle de fonction) |
|
|
(C++20)
|
sauvegarde le résultat de N applications d'une fonction
(objet fonction algorithme) |