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()).