C++C++ Explainer
C++ · 5 · STL24 / 36 · 67%

Ranges & Views (C++20)

Composable, lazy pipelines that replace nested loops.

Examples: views::filter, transform, take, ranges::sort

shortcuts: ← prev · → next · M mark
1

No More begin/end

Range algorithms take the container directly.

Example
example
#include <ranges>
#include <algorithm>

std::ranges::sort(v);
auto it = std::ranges::find(v, 42);
bool ok = std::ranges::all_of(v, is_valid);
2

Views Pipe Together

Views are lazy — nothing runs until you iterate.

Example
example
namespace rv = std::views;

auto result = v
    | rv::filter([](int x){ return x % 2 == 0; })
    | rv::transform([](int x){ return x * x; })
    | rv::take(5);

for (int x : result) std::cout << x << ' ';
TIP
No intermediate vectors are allocated — each element flows through the whole pipeline once.
3

Handy Views

The ones you will reach for daily.

Complexity
views::filterkeep matching
views::transformmap each element
views::take / dropslice
views::reverseiterate backwards
views::iota(0, n)lazy number range
views::split / jointokenize
4

Dangling Views

A view does not own its data.

Example
example
auto bad() {
    std::vector<int> v{1,2,3};
    return v | std::views::filter(odd);   // DANGLING: v dies here
}

auto ok = std::ranges::to<std::vector>(   // C++23: materialize
    v | std::views::filter(odd));