Language 2 of 10 · Topic 0.6

Control Flow: Range-Based For Loops & C++20 Ranges (<ranges>)

1Concept

Modern C++ uses range-based for loops (for (const auto& elem : container)). C++20 introduced std::views and ranges pipelines (ranges::views::filter, ranges::views::transform) for lazy evaluation without intermediate vector copies.

2Architecture Diagram

std::vector ──► | views::filter(even) ──► | views::transform(square) ──► Range-For (Lazy)

3Code Example

Stage 0 Language Foundations
#include <iostream>
#include <vector>
#include <ranges>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::cout << "=== C++20 Ranges Lazy Pipeline ===\n";
    // Lazy pipeline: filter even numbers and square them
    auto even_squares = numbers 
        | std::views::filter([](int n) { return n % 2 == 0; })
        | std::views::transform([](int n) { return n * n; });

    for (int val : even_squares) {
        std::cout << val << " ";
    }
    std::cout << "\n";

    return 0;
}

4Expected Output

=== C++20 Ranges Lazy Pipeline ===
4 16 36 64 100 

5Key Takeaways

  • Always use const auto& in range-for loops to prevent unintended object copies.
  • C++20 ranges and views are lazily evaluated and create zero temporary allocations.
  • Ranges eliminate legacy iterator pair boilerplates (begin(), end()).