All Recipes
Home/Ranges/Range Adaptors
🔗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