Namensräume
Varianten
Aktionen

std::generate

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
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 ForwardIt, class Generator >
void generate( ForwardIt first, ForwardIt last, Generator g );
(1) (constexpr seit C++20)
template< class ExecutionPolicy, class ForwardIt, class Generator >

void generate( ExecutionPolicy&& policy,

               ForwardIt first, ForwardIt last, Generator g );
(2) (seit C++17)
1) Weist jedem Element im Bereich [firstlast) einen Wert zu, der vom gegebenen Funktions-Objekt g generiert wird.
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)

Inhalt

[bearbeiten] Parameter

first, last - das Iteratorenpaar, das den Bereich der zu generierenden Elemente definiert
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 ForwardIt dereferenziert und ein Wert vom Typ Ret zugewiesen werden kann. ​

Typanforderungen
-
ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.

[bearbeiten] Komplexität

Genau std::distance(first, last) Aufrufe von g() und Zuweisungen.

[bearbeiten] 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.

[bearbeiten] Mögliche Implementierung

template<class ForwardIt, class Generator>
constexpr //< since C++20
void generate(ForwardIt first, ForwardIt last, Generator g)
{
    for (; first != last; ++first)
        *first = g();
}

[bearbeiten] Beispiel

#include <algorithm>
#include <iostream>
#include <vector>
 
void println(std::string_view fmt, const auto& v)
{
    for (std::cout << fmt; const auto& e : v)
        std::cout << e << ' ';
    std::cout << '\n';
};
 
 
int f()
{
    static int i;
    return ++i;
}
 
int main()
{
    std::vector<int> v(5);
 
    std::generate(v.begin(), v.end(), f);
    println("v: ", v);
 
    // Initialize with default values 0,1,2,3,4 from a lambda function
    // Equivalent to std::iota(v.begin(), v.end(), 0);
    std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });
    println("v: ", v);
}

Ausgabe

v: 1 2 3 4 5
v: 0 1 2 3 4

[bearbeiten] Siehe auch

Weist jedem Element in einem Bereich den gegebenen Wert zu
(Funktionstempelat) [edit]
Weist die Ergebnisse aufeinanderfolgender Funktionsaufrufe N Elementen in einem Bereich zu
(Funktionstempelat) [edit]
(C++11)
füllt einen Bereich mit sukzessiven Inkrementen des Startwerts
(Funktionstemplate) [bearbeiten]
Speichert das Ergebnis einer Funktion in einem Bereich
(Algorithmus-Funktionsobjekt)[edit]