std:: generate_n
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
OutputIt,
class
Size,
class
Generator
>
OutputIt generate_n ( OutputIt first, Size count, Generator g ) ; |
(1) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
Size,
class
Generator
>
|
(2) | (seit C++17) |
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> ist true . |
(bis C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> ist true . |
(seit C++20) |
Wenn
Size
nicht in einen
integralen Typ
konvertierbar
ist, ist das Programm fehlerhaft.
Inhaltsverzeichnis |
Parameter
| first | - | der Anfang des Bereichs der zu generierenden Elemente | ||||||
| count | - | Anzahl der zu generierenden Elemente | ||||||
| policy | - | die zu verwendende Ausführungsrichtlinie | ||||||
| g | - |
Generator-Funktionsobjekt, das aufgerufen wird.
Die Signatur der Funktion sollte äquivalent zu Folgendem sein:
Der Typ Ret muss so beschaffen sein, dass ein Objekt vom Typ OutputIt dereferenziert und mit einem Wert vom Typ Ret zugewiesen werden kann. |
||||||
| Typanforderungen | ||||||||
-
OutputIt
muss die Anforderungen von
LegacyOutputIterator
erfüllen.
|
||||||||
-
ForwardIt
muss die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||||||||
Rückgabewert
Iterator eines Elements nach dem letzten zugewiesenen Element, falls count > 0 , first andernfalls.
Komplexität
Genau std:: max ( 0 , count ) Aufrufe von g ( ) und Zuweisungen.
Ausnahmen
Die Überladung mit einem Template-Parameter namens
ExecutionPolicy
meldet Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allokieren kann, wird std::bad_alloc geworfen.
Mögliche Implementierung
template<class OutputIt, class Size, class Generator> constexpr // seit C++20 OutputIt generate_n(OutputIt first, Size count, Generator g) { for (Size i = 0; i < count; ++i, ++first) *first = g(); return first; } |
Beispiel
#include <algorithm> #include <functional> #include <iostream> #include <iterator> #include <random> int main() { std::mt19937 rng; // default constructed, seeded with fixed seed std::generate_n(std::ostream_iterator<std::mt19937::result_type>(std::cout, " "), 5, std::ref(rng)); std::cout << '\n'; }
Ausgabe:
3499211612 581869302 3890346734 3586334585 545404204
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 426 | C++98 |
die Komplexitätsanforderung war "genau
count
Aufrufe
oder Zuweisungen", was fehlerhaft ist, wenn count negativ ist |
keine Aufrufe oder Zuweisungen
wenn count nicht-positiv ist |
| LWG 865 | C++98 |
die Position des ersten Elements nach
dem Generierungsbereich wurde nicht zurückgegeben |
zurückgegeben |
Siehe auch
|
weist den angegebenen Wert N Elementen in einem Bereich zu
(Funktions-Template) |
|
|
weist die Ergebnisse sukzessiver Funktionsaufrufe jedem Element in einem Bereich zu
(Funktions-Template) |
|
|
(C++20)
|
speichert das Ergebnis von N Aufrufen einer Funktion
(Algorithmus-Funktionsobjekt) |