Namespaces
Variants

std::ranges::generate_n

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les plages (C++20)
Algorithmes contraints, ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatives    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatives
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
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

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

Opérations de tri
Opérations de recherche binaire
(sur plages partitionnées)
Opérations d'ensemble (sur plages triées)
Opérations de fusion (sur plages triées)
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 modificatives
Opérations de séquence modificatives
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur plages triées)
       
       
Opérations d'ensemble (sur plages triées)
Opérations de tas
Opérations de minimum/maximum
       
       
Opérations de permutation
Opérations de pliage (fold)
Opérations sur la mémoire non initialisée
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
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 );
(depuis C++20)

Attribue le résultat d'invocations successives de l'objet fonction gen à chaque élément de la plage [firstfirst + n), si 0 < n. Ne fait rien sinon.

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

Paramètres

first - début de la plage d'éléments à modifier
n - nombre d'éléments à modifier
gen - l'objet fonction générateur

Valeur de retour

Itérateur pointant après le dernier élément assigné si 0 < count , first sinon.

Complexité

Exactement n invocations de gen ( ) et assignations.

Implémentation possible

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

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

Sortie possible :

5 5 2 2 6 6 3 5 (dice)
0 1 2 3 4 5 6 7 (iota)

Voir aussi

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