🔗advanced
Range Adaptors
Learn about different range adaptors and when to use them
Example Code
cpp
#include <ranges>#include <vector>#include <iostream>#include <numeric>int main() { // iota - generate sequence of values auto counting = std::views::iota(1, 11); // 1 to 10 // reverse - reverse iteration std::vector<int> v = {1, 2, 3, 4, 5}; for (int n : v | std::views::reverse) { std::cout << n << " "; // 5 4 3 2 1 } std::cout << std::endl; // enumerate - get index and value (C++23, but useful to know) // keys/values - for associative containers // zip - combine multiple ranges (C++23) // Practical example: find first N primes auto is_prime = [](int n) { if (n < 2) return false; for (int i = 2; i * i <= n; ++i) { if (n % i == 0) return false; } return true; }; auto primes = std::views::iota(2) | std::views::filter(is_prime) | std::views::take(10); std::cout << "First 10 primes: "; for (int p : primes) { std::cout << p << " "; } std::cout << std::endl; return 0;}Explanation
C++20 provides many built-in range adaptors. std::views::iota generates sequences, reverse reverses iteration order. These can be combined with filter and transform for powerful data processing.
Key Points
- 1iota - infinite or bounded sequences
- 2reverse - iterate backwards
- 3Adaptors can work with infinite ranges
- 4take() limits infinite ranges