std::ranges::generate
Von de.cppreference.net
| (C++23) <algorithm>
|
||
| Definiert in Header |
||
template< std::input_or_output_iterator O, std::sentinel_for<O> S,
std::copy_constructible F >
requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
constexpr O
generate( O first, S last, F gen );
|
Aufrufsignatur | (1) |
template< class R, std::copy_constructible F >
requires std::invocable<F&> && ranges::output_range<R, std::invoke_result_t<F&>>
constexpr ranges::borrowed_iterator_t<R>
generate( R&& r, F gen );
|
(seit C++20) | (2) |
(seit C++20)1) Weist das Ergebnis aufeinanderfolgender
gen Aufrufe des Funktionsobjekts [first, last) jedem Element im Bereich zu.2) Wie (1)
r, verwendet jedoch ranges::begin(r) als Bereich, als ob first als ranges::end(r) und last als verwendet würden.Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als Niebloids
- bekannt), das heißt:
- Explizite Vorlagenargumentlisten können beim Aufruf keiner von ihnen angegeben werden.Keine von ihnen ist für die argumentabhängige Namenssuche
- sichtbar.Wenn eine von ihnen durch normale unqualifizierte Namenssuche als Name links vom Funktionsaufrufoperator gefunden wird, wird die argumentabhängige Namenssuche
der zu modifizierenden Elemente definiert
| r | - | der Bereich der zu modifizierenden Elemente gen - |
| das Generator-Funktionsobjekt | Rückgabewert | Ein Ausgabeiterator, der gleich |
| ist. | Komplexität | Genau |
Aufrufe von
und Zuweisungen.
lastMögliche Implementierung
Beispiel
Dieses Codebeispiel ausführenranges::distance(first, last)Mögliche Ausgabe:
gen()Siehe auch
ranges::generate_n
struct generate_fn
{
template<std::input_or_output_iterator O, std::sentinel_for<O> S,
std::copy_constructible F>
requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
constexpr O operator()(O first, S last, F gen) const
{
for (; first != last; *first = std::invoke(gen), ++first)
{}
return first;
}
template<class R, std::copy_constructible F>
requires std::invocable<F&> && ranges::output_range<R, std::invoke_result_t<F&>>
constexpr ranges::borrowed_iterator_t<R> operator()(R&& r, F gen) const
{
return (*this)(ranges::begin(r), ranges::end(r), std::move(gen));
}
};
inline constexpr generate_fn generate {};
|
(C++20)
speichert das Ergebnis von N Aufrufen einer Funktion
#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 device;
static std::mt19937 engine {device()};
return distr(engine);
}
void iota(auto& r, int init)
{
std::ranges::generate(r, [init] mutable { return init++; });
}
void print(std::string_view comment, const auto& v)
{
for (std::cout << comment; int i : v)
std::cout << i << ' ';
std::cout << '\n';
}
int main()
{
std::array<int, 8> v;
std::ranges::generate(v.begin(), v.end(), dice);
print("dice: ", v);
std::ranges::generate(v, dice);
print("dice: ", v);
iota(v, 1);
print("iota: ", v);
}
(Algorithmus-Funktionsobjekt)
dice: 4 3 1 6 6 4 5 5
dice: 4 2 5 3 6 2 6 2
iota: 1 2 3 4 5 6 7 8
ranges::fill
weist einem Bereich von Elementen einen bestimmten Wert zu |
(Algorithmus-Funktionsobjekt) ranges::fill_n |
weist einer Anzahl von Elementen einen Wert zu |
(Algorithmus-Funktionsobjekt) ranges::transform |
wendet eine Funktion auf einen Bereich von Elementen an |
(Algorithmus-Funktionsobjekt) ranges::generate_random |
füllt einen Bereich mit Zufallszahlen aus einem gleichmäßigen Zufallsbitgenerator |
(Algorithmus-Funktionsobjekt) generate |
| generate weist die Ergebnisse aufeinanderfolgender Funktionsaufrufe jedem Element in einem Bereich zu | |
| |