std::generate_n
| Definiert in 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 ganzzahligen Typ konvertierbar ist, ist das Programm schlecht geformt.
Inhalt |
[edit] Parameter
| first | - | Der Anfang des Bereichs von zu generierenden Elementen | ||||||
| zählt | - | Anzahl der zu generierenden Elemente | ||||||
| policy | - | die Ausführungsrichtlinie, die verwendet werden soll | ||||||
| g | - | Generator-Funktions-Objekt, das aufgerufen wird. Die Signatur der Funktion sollte äquivalent zu folgender sein:
Der Typ Ret muss so beschaffen sein, dass ein Objekt vom Typ OutputIt dereferenziert und einem Wert vom Typ Ret zugewiesen werden kann. | ||||||
| Typanforderungen | ||||||||
-OutputIt muss die Anforderungen an LegacyOutputIterator erfüllen. | ||||||||
-ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen. | ||||||||
[edit] Rückgabewert
Iterator auf das letzte zugewiesene Element, falls count > 0, andernfalls first.
[edit] Komplexität
Genau std::max(0, count) Aufrufe von g() und Zuweisungen.
[edit] Ausnahmen
Die Überladung mit einem Template-Parameter namens ExecutionPolicy meldet Fehler wie folgt
- Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsabhängig. - Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.
[edit] Mögliche Implementierung
template<class OutputIt, class Size, class Generator> constexpr // since C++20 OutputIt generate_n(OutputIt first, Size count, Generator g) { for (Size i = 0; i < count; ++i, ++first) *first = g(); return first; } |
[edit] 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
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 426 | C++98 | Die Komplexitätsanforderung war "genau count Aufrufe oder Zuweisungen", was fehlerhaft ist, wenn count negativ ist |
kein Aufruf oder Zuweisung wenn count nicht positiv ist |
| LWG 865 | C++98 | die Position des ersten Elements nach Der Generierungsbereich wurde nicht zurückgegeben |
zurückgegeben |
[edit] Siehe auch
| Weist N Elementen in einem Bereich den gegebenen Wert zu (Funktionstempelat) | |
| Weist die Ergebnisse aufeinanderfolgender Funktionsaufrufe jedem Element in einem Bereich zu (Funktionstempelat) | |
| (C++20) |
Speichert das Ergebnis von N Funktionsanwendungen (Algorithmus-Funktionsobjekt) |