Namespaces
Variants
Actions

std::ranges::generate_n

From cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
Algorithm library
Constrained algorithms, e.g. ranges::copy, ranges::sort, ...
(C++11)
(C++11)
(C++17)

 
Constrained algorithms
All names in this menu belong to namespace std::ranges
       
       
    
     
         
       
       
(C++23)
(C++23)  
(C++23)
(C++23)  
(C++23)            
 
Defined in header <algorithm>
Call signature
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 );
(since C++20)

Assigns the result of successive invocations of the function object gen to each element in the range [firstfirst + n), if 0 < n. Does nothing otherwise.

The function-like entities described on this page are algorithm function objects (informally known as niebloids), that is:

[edit] Parameters

first - the beginning of the range of elements to modify
n - number of elements to modify
gen - the generator function object.

[edit] Return value

Iterator one past the last element assigned if 0 < count, first otherwise.

[edit] Complexity

Exactly n invocations of gen() and assignments.

[edit] Possible implementation

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

[edit] Example

Run this code
#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");
}

Possible output:

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

[edit] See also

saves the result of a function in a range
(algorithm function object)[edit]
fills a range with random numbers from a uniform random bit generator
(algorithm function object)[edit]
assigns a range of elements a certain value
(algorithm function object)[edit]
assigns a value to a number of elements
(algorithm function object)[edit]
applies a function to a range of elements
(algorithm function object)[edit]
assigns the results of successive function calls to N elements in a range
(function template) [edit]
Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/ranges/generate_n&oldid=171008"

AltStyle によって変換されたページ (->オリジナル) /