std::generate(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

std::generate(3) β€” straight from the C++ Standard Libary, and yes bestie, this is the whole page about it πŸ’–βœ¨

🌸 NAME 🌸

std::generate β€” std::generate (it’s giving β€œname so nice they said it twice”, no cap πŸ’…)

✨ Synopsis ✨

Defined in header <algorithm> β€” don’t forget it, bestie, or your build is gonna be like ??? 😭

template< class ForwardIt, class Generator >
void generate( ForwardIt first, ForwardIt last, Generator g );  (1) (constexpr since C++20)

template< class ExecutionPolicy, class ForwardIt, class Generator >
void generate( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, Generator g );  (2) (since C++17)
  1. Assigns each element in range [first, last) a value generated by the given function object g. Literally every element gets a fresh little gift from g 🎁
  2. Same as (1), but executed according to policy. Slay, but parallel-ish vibes.

This overload participates in overload resolution only if std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true. (until C++20) And if std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> is true. (since C++20) β€” yes, they changed the trait, bestie, keep up 😌

πŸ’– 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:
Ret fun();

The type Ret must be such that an object of type ForwardIt can be dereferenced and assigned a value of type Ret. So like, g hands you a Ret, and the iterator has to be able to take it. Periodt πŸ’…

🧚 Type requirements 🧚

  • ForwardIt must meet the requirements of LegacyForwardIterator. No fake iterators allowed, bestie 🚫

πŸ”₯ Complexity πŸ”₯

Exactly std::distance(first, last) invocations of g() and assignments. That’s the whole budget β€” no extra credit, no sneaky bonus calls πŸ”₯

πŸ’€ Exceptions πŸ’€

The overload with a template parameter named ExecutionPolicy reports errors as follows β€” and this is the tea β˜•:

  • If execution of a function invoked as part of the algorithm throws an exception and ExecutionPolicy is one of the standard policies, std::terminate is called. For any other ExecutionPolicy, the behavior is implementation-defined. (Yikes, bestie πŸ’€)
  • If the algorithm fails to allocate memory, std::bad_alloc is thrown.

🌈 Possible implementation 🌈

Here’s the vibe of how it can be implemented β€” not mandatory, just iconic:

template<class ForwardIt, class Generator>
constexpr //< since C++20
void generate(ForwardIt first, ForwardIt last, Generator g)
{
    for (; first != last; ++first)
        *first = g();
}

πŸ“ Example πŸ“

Run this code, bestie β€” it’s a whole little demo:

// Run this code

#include <algorithm>
#include <iostream>
#include <vector>

void println(std::string_view fmt, const auto& v)
{
    for (std::cout << fmt; const auto& 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

πŸ¦‹ See also πŸ¦‹

  • fill β€” copy-assigns the given value to every element in a range (function template)
  • generate_n β€” assigns the results of successive function calls to N elements in a range (function template)
  • iota (C++11) β€” fills a range with successive increments of the starting value (function template)
  • ranges::generate (C++20) β€” saves the result of a function in a range (niebloid)

Mwah πŸ’‹ β€” source/version/date check: http://cppreference.com Β· 2024.06.10 Β· std::generate(3). Now go generate something iconic, bestie πŸŽ€βœ¨

πŸ“¦ where this page comes from