Namensräume
Varianten
Aktionen

std::generate_n

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
generate_n
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
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 >
ForwardIt generate_n( ExecutionPolicy&& policy,

                      ForwardIt first, Size count, Generator g );
(2) (seit C++17)
1) Weist Werte, die vom gegebenen Funktions-Objekt g generiert werden, den ersten count Elementen im Bereich beginnend bei first zu, falls count > 0. Andernfalls tut es nichts.
2) Wie (1), wird aber gemäß policy ausgeführt.
Diese Überladung nimmt an der Überladungsauflösung teil, nur wenn alle folgenden Bedingungen erfüllt sind

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:

Ret fun();

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 ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist 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) [edit]
Weist die Ergebnisse aufeinanderfolgender Funktionsaufrufe jedem Element in einem Bereich zu
(Funktionstempelat) [edit]
Speichert das Ergebnis von N Funktionsanwendungen
(Algorithmus-Funktionsobjekt)[edit]