std::ranges::generate_n
Von de.cppreference.net
| Definiert in Header <algorithm>
|
||
| Aufrufsignatur |
||
template< std::input_or_output_iterator O, std::copy_constructible F >
requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
constexpr O
generate_n( O first, std::iter_difference_t<O> n, F gen );
|
(seit C++20) | |
Weist das Ergebnis aufeinanderfolgender Aufrufe des Funktionsobjekts gen jedem Element im Bereich [first, first + n) zu, falls 0 < n. Andernfalls tut es nichts.
Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als Niebloids bekannt), das heißt:
- Explizite Vorlagenargumentlisten können nicht angegeben werden, wenn eines von ihnen aufgerufen wird.
- Keines von ihnen ist für argumentabhängige Suche sichtbar.
- Wenn eines von ihnen durch normale unqualifizierte Suche als Name links vom Funktionsaufrufoperator gefunden wird, wird argumentabhängige Suche unterbunden.
Parameter
| first | - | der Anfang des Bereichs der zu modifizierenden Elemente |
| n | - | Anzahl der zu modifizierenden Elemente |
| gen | - | das Generatorfunktionsobjekt. |
Rückgabewert
Iterator, der auf das letzte zugewiesene Element folgt, wenn 0 < count, andernfalls first.
Komplexität
Genau n Aufrufe von gen() und Zuweisungen.
Mögliche Implementierung
struct generate_n_fn
{
template<std::input_or_output_iterator O, std::copy_constructible F>
requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
constexpr O operator()(O first, std::iter_difference_t<O> n, F gen) const
{
for (; n-- > 0; *first = std::invoke(gen), ++first)
{}
return first;
}
};
inline constexpr generate_n_fn generate_n {};
|
Beispiel
Diesen Code ausführen
#include <algorithm>
#include <array>
#include <iostream>
#include <random>
#include <string_view>
auto dice()
{
static std::uniform_int_distribution<int> distr {1, 6};
static std::random_device engine;
static std::mt19937 noise {engine()};
return distr(noise);
}
void print(const auto& v, std::string_view comment)
{
for (int i : v)
std::cout << i << ' ';
std::cout << '(' << comment << ")\n";
}
int main()
{
std::array<int, 8> v;
std::ranges::generate_n(v.begin(), v.size(), dice);
print(v, "dice");
std::ranges::generate_n(v.begin(), v.size(), [n {0}] mutable { return n++; });
// same effect as std::iota(v.begin(), v.end(), 0);
print(v, "iota");
}
Mögliche Ausgabe:
5 5 2 2 6 6 3 5 (dice)
0 1 2 3 4 5 6 7 (iota)
Siehe auch
(C++20) |
speichert das Ergebnis einer Funktion in einem Bereich (Algorithmus-Funktionsobjekt) |
(C++26) |
füllt einen Bereich mit Zufallszahlen aus einem gleichmäßigen Zufallsbitgenerator (Algorithmus-Funktionsobjekt) |
(C++20) |
weist einem Bereich von Elementen einen bestimmten Wert zu (Algorithmus-Funktionsobjekt) |
(C++20) |
weist einer Anzahl von Elementen einen Wert zu (Algorithmus-Funktionsobjekt) |
(C++20) |
wendet eine Funktion auf einen Bereich von Elementen an (Algorithmus-Funktionsobjekt) |
| weist die Ergebnisse aufeinanderfolgender Funktionsaufrufe N Elementen in einem Bereich zu (Funktionstemplate) |