CodeNebula
C++20stladvanced

std::ranges::fill / fill_n / generate / generate_n (C++20 Addition)

C++20 · The Big Four · Compiler flag: -std=c++20

Explanation

`fill`/`fill_n` set elements to a value. `generate`/`generate_n` set elements by calling a generator function repeatedly. All work with ranges and support sentinels.

Real-World Scenario

Initialize a game board with default cell values or generate random terrain heights.

Quick Snippet

snippet.cpp
#include <ranges>
#include <algorithm>
#include <vector>
#include <random>

std::vector<int> grid(100);
std::ranges::fill(grid, 0);

std::mt19937 rng{42};
std::ranges::generate(grid, [&]() { return rng() % 10; });

Full Example

ranges_fill_generate.cpp
// CodeNebula - C++20 Example: ranges::fill, fill_n, generate, generate_n
// Compile: g++ -std=c++20 -Wall -Wextra -o example ranges_fill_generate.cpp

#include <iostream>
#include <ranges>
#include <vector>
#include <string>
#include <algorithm>

int main() {
    // ranges::fill - fill entire range with a value
    std::vector<int> nums(8);
    std::ranges::fill(nums, 42);
    std::cout << "Filled with 42: ";
    for (int n : nums) std::cout << n << " ";
    std::cout << "\n";

    // Fill a subrange
    std::ranges::fill(nums.begin() + 2, nums.begin() + 6, 99);
    std::cout << "Partial fill with 99: ";
    for (int n : nums) std::cout << n << " ";
    std::cout << "\n";

    // ranges::fill_n - fill N elements starting from iterator
    std::vector<int> data(10, 0);
    std::ranges::fill_n(data.begin(), 5, 7);
    std::cout << "Fill_n (5 sevens): ";
    for (int n : data) std::cout << n << " ";
    std::cout << "\n";

    // ranges::generate - fill with values from a generator function
    std::vector<int> squares(8);
    int counter = 1;
    std::ranges::generate(squares, [&counter]() { return counter * counter++; });
    std::cout << "\nGenerated squares: ";
    for (int n : squares) std::cout << n << " ";
    std::cout << "\n";

    // Generate Fibonacci sequence
    std::vector<int> fib(10);
    int a = 0, b = 1;
    std::ranges::generate(fib, [&a, &b]() {
        int result = a;
        a = b;
        b = result + b;
        return result;
    });
    std::cout << "Fibonacci: ";
    for (int n : fib) std::cout << n << " ";
    std::cout << "\n";

    // ranges::generate_n - generate N values
    std::vector<int> powers;
    int base = 1;
    std::ranges::generate_n(std::back_inserter(powers), 8,
                            [&base]() { return base *= 2; });
    std::cout << "Powers of 2: ";
    for (int n : powers) std::cout << n << " ";
    std::cout << "\n";

    // generate_n with counting labels
    std::vector<std::string> labels;
    int id = 0;
    std::ranges::generate_n(std::back_inserter(labels), 5,
                            [&id]() { return "item_" + std::to_string(++id); });
    std::cout << "\nLabels: ";
    for (const auto& l : labels) std::cout << l << " ";
    std::cout << "\n";
    return 0;
}
Run command
g++ -std=c++20 -Wall -Wextra -o example ranges_fill_generate.cpp