std::ranges::generate_n - cppreference.com

From cppreference.com

Defined in header

<algorithm>

Call signature

template<std::input_or_output_iteratorO,std::copy_constructibleF>requiresstd::invocable<F&>&&std::indirectly_writable<O,std::invoke_result_t<F&>>constexprOgenerate_n(Ofirst,std::iter_difference_t<O>count,Fgen);(since C++20)If count is positive, assigns the result of successive evaluations of gen() to each element in the target range [first, std::next(first,count)). Otherwise does nothing.

The function-like entities described on this page are

algorithm function objects

(informally known as niebloids), that is:

Explicit template argument lists cannot be specified when calling any of them.

None of them are visible to

argument-dependent lookup

.

When any of them are found by

normal unqualified lookup

as the name to the left of the function-call operator,

argument-dependent lookup

is inhibited.

Parameters

first - the beginning of the target range count - number of elements to modify gen - the generator function object Return value

The past-the-end iterator of the target range, or first if count is non-positive.

Complexity

Given N as max(count,0):

1) Exactly N evaluations of gen() and N assignments.

Possible implementation

structgenerate_n_fn{template<std::input_or_output_iteratorO,std::copy_constructibleF>requiresstd::invocable<F&>&&std::indirectly_writable<O,std::invoke_result_t<F&>>constexprOoperator()(Ofirst,std::iter_difference_t<O>count,Fgen)const{for(;count-->0;*first=std::invoke(gen),++first){}returnfirst;}};inlineconstexprgenerate_n_fngenerate_n{};Example

Run this code

#include<algorithm>#include<array>#include<iostream>#include<random>#include<string_view>autodice(){staticstd::uniform_int_distribution<int>distr{1,6};staticstd::random_deviceengine;staticstd::mt19937noise{engine()};returndistr(noise);}voidprint(constauto&v,std::string_viewcomment){for(inti:v)std::cout<<i<<' ';std::cout<<'('<<comment<<")\n";}intmain(){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{returnn++;});// 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) See also

generate_n

assigns the results of successive function calls to N elements in a range
(function template)

[edit]

ranges::generate

(C++20)

saves the result of a function in a range
(algorithm function object)

[edit]

ranges::generate_random

(C++26)

fills a range with random numbers from a uniform random bit generator
(algorithm function object)

[edit]

ranges::fill

(C++20)

assigns a range of elements a certain value
(algorithm function object)

[edit]

ranges::fill_n

(C++20)

assigns a value to a number of elements
(algorithm function object)

[edit]

ranges::transform

(C++20)

applies a function to a range of elements
(algorithm function object)

[edit]