std::generate() algorithm
- od C++20
- od C++17
- do C++17
// (1)
template< class ForwardIt, class Generator >
constexpr void generate( ForwardIt first, ForwardIt last, Generator g );
// (2)
template< class ExecutionPolicy, class ForwardIt, class Generator >
void generate( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, Generator g );
// (1)
template< class ForwardIt, class Generator >
void generate( ForwardIt first, ForwardIt last, Generator g );
// (2)
template< class ExecutionPolicy, class ForwardIt, class Generator >
void generate( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, Generator g );
// (1)
template< class ForwardIt, class Generator >
void generate( ForwardIt first, ForwardIt last, Generator g );
-
(1) Assigns each element in range [
first;last) a value generated by the given function objectg. -
(2) Same as (1), but executed according to
policy.
Overload Resolution
These overloads participate in overload resolution only if
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> (do C++20) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> (od C++20) is true.
Parameters
first last | The range of elements to generate. |
policy | The execution policy to use. See execution policy for details. |
g | Generator function object that will be called. The signature of the function should be equivalent to the following:
|
Type requirements
ForwardIt | LegacyForwardIterator |
Return value
(none)
Complexity
Exactly std::distance(first, last) invocations of g() and assignments.
Exceptions
The overloads with a template parameter named ExecutionPolicy report errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception and
ExecutionPolicyis one of the standard policies,std::terminateis called. For none otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory,
std::bad_allocis thrown.
Possible implementation
generate (1)
Examples
Main.cpp
#include <algorithm>
#include <iostream>
#include <vector>
void println(std::string_view fmt, auto const& v)
{
for (std::cout << fmt; auto const& e : v)
std::cout << e << ' ';
std::cout << '\n';
};
int f()
{
static int i;
return ++i;
}
int main()
{
std::vector<int> v(5);
std::generate(v.begin(), v.end(), f);
println("v: ", v);
// Initialize with default values 0,1,2,3,4 from a lambda function
// Equivalent to std::iota(v.begin(), v.end(), 0);
std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });
println("v: ", v);
}
Output
v: 1 2 3 4 5
v: 0 1 2 3 4
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.
Hover to see the original license.