CodeNebula
C++20stladvanced

std::views::iota / std::ranges::iota_view (C++20 Addition)

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

Explanation

Generates a sequence of incrementing values starting from an initial value, either bounded (with an end value) or unbounded (infinite). Replaces manual index loops with a range-friendly generator.

Real-World Scenario

Generate sequential IDs for newly created entities in a game without maintaining a separate counter variable.

Quick Snippet

snippet.cpp
#include <ranges>

// Bounded: generates 0, 1, 2, ..., 99
for (int i : std::views::iota(0, 100)) { /* use i */ }

// Unbounded: infinite sequence starting at 1
auto naturals = std::views::iota(1);
auto first_five = naturals | std::views::take(5);  // 1, 2, 3, 4, 5

Full Example

ranges_iota_view.cpp
// CodeNebula - C++20 Example: std::ranges::iota_view
// Compile: g++ -std=c++20 -Wall -Wextra -o example ranges_iota_view.cpp

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

int main() {
    // iota_view generates a sequence of incrementing values
    // Bounded iota: [start, end)
    std::cout << "Numbers 1 to 10: ";
    for (int n : std::ranges::iota_view(1, 11))
        std::cout << n << " ";
    std::cout << "\n";

    // Using views::iota adaptor
    std::cout << "Numbers 0 to 4: ";
    for (int n : std::views::iota(0, 5))
        std::cout << n << " ";
    std::cout << "\n";

    // Unbounded iota with take
    std::cout << "First 8 from 100: ";
    for (int n : std::views::iota(100) | std::views::take(8))
        std::cout << n << " ";
    std::cout << "\n";

    // Generate even numbers using iota + transform
    std::cout << "\nFirst 10 even numbers: ";
    for (int n : std::views::iota(1) | std::views::transform([](int i) { return i * 2; })
                                      | std::views::take(10))
        std::cout << n << " ";
    std::cout << "\n";

    // Generate squares using iota
    std::cout << "Squares 1-8: ";
    for (int n : std::views::iota(1, 9)
                 | std::views::transform([](int i) { return i * i; }))
        std::cout << n << " ";
    std::cout << "\n";

    // Use iota for indexing
    std::vector<std::string> names = {"Alice", "Bob", "Charlie", "Diana"};
    std::cout << "\nIndexed list:\n";
    for (int i : std::views::iota(0, static_cast<int>(names.size())))
        std::cout << "  [" << i << "] " << names[i] << "\n";

    // Filter iota for specific values
    std::cout << "Multiples of 3 up to 30: ";
    for (int n : std::views::iota(1, 31)
                 | std::views::filter([](int i) { return i % 3 == 0; }))
        std::cout << n << " ";
    std::cout << "\n";

    // Iota with characters
    std::cout << "Alphabet: ";
    for (char c : std::views::iota('a', static_cast<char>('z' + 1)))
        std::cout << c;
    std::cout << "\n";

    return 0;
}
Run command
g++ -std=c++20 -Wall -Wextra -o example ranges_iota_view.cpp