Namespaces
Variants

std::ranges::generate

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur intervalles (C++20)
Algorithmes contraints, p.ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modifiantes    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modifiantes
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(until C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Opérations de tri et connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur intervalles partitionnés)
Opérations d'ensemble (sur intervalles triés)
Opérations de fusion (sur intervalles triés)
Opérations de tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modifiantes
Opérations de séquence modifiantes
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur intervalles triés)
       
       
Opérations d'ensemble (sur intervalles triés)
Opérations de tas
Opérations de minimum/maximum
       
       
Opérations de permutation
Opérations de pliage
Opérations sur le stockage non initialisé
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
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 );
(1) (depuis C++20)
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 );
(2) (depuis C++20)
1) Attribue le résultat de successives invocations de l'objet fonction gen à chaque élément de l'intervalle [firstlast).
2) Identique à (1), mais utilise r comme intervalle, comme si on utilisait ranges::begin(r) comme first et ranges::end(r) comme last.

Les entités de type fonction décrites sur cette page sont des objets fonctions algorithmiques (informellement connus sous le nom de niebloïdes), c'est-à-dire :

Paramètres

first, last - la paire itérateur-sentinelle définissant la plage des éléments à modifier
r - la plage des éléments à modifier
gen - l'objet fonction générateur

Valeur de retour

Un itérateur de sortie qui compare égal à last .

Complexité

Exactement ranges:: distance ( first, last ) invocations de gen ( ) et assignations.

Implémentation possible

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 {};

Exemple

#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);
}

Sortie possible :

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

Voir aussi

sauvegarde le résultat de N applications d'une fonction
(objet fonction algorithme)
assigne une valeur à une plage d'éléments
(objet fonction algorithme)
assigne une valeur à un nombre d'éléments
(objet fonction algorithme)
applique une fonction à une plage d'éléments
(objet fonction algorithme)
remplit une plage avec des nombres aléatoires d'un générateur de bits aléatoire uniforme
(objet fonction algorithme)
assigne les résultats d'appels successifs de fonction à chaque élément d'une plage
(modèle de fonction)