views::transform
C++20Apply a function to each element lazily.
Section hub
std::ranges::filter_view is the concrete view type that exposes only elements satisfying a predicate.
std::ranges::views::filter is the range adaptor object used in pipelines and direct adaptor calls to produce a filter_view.
template< ranges::input_range V,
std::indirect_unary_predicate<ranges::iterator_t<V>> Pred >
requires ranges::view<V> && std::is_object_v<Pred>
class filter_view
: public ranges::view_interface<filter_view<V, Pred>>
(since C++20)
namespace views {
inline constexpr /* unspecified */ filter = /* unspecified */;
}
(since C++20)
template< ranges::viewable_range R, class Pred >
requires /* see below */
constexpr ranges::view auto filter( R&& r, Pred&& pred );
(since C++20)
template< class Pred >
constexpr /* range adaptor closure */ filter( Pred&& pred );
(since C++20)
#include <iostream>
#include <ranges>
int main()
{
auto even = [](int i) { return 0 == i % 2; };
auto square = [](int i) { return i * i; };
for (int i : std::views::iota(0, 6)
| std::views::filter(even)
| std::views::transform(square))
std::cout << i << ' ';
std::cout << '\n';
}
filter_view performs lazy filtering: elements are tested against the predicate as iteration advances, and failing elements are skipped.
The adaptor stores a view of the underlying range plus a predicate object. A pipeline such as r | std::views::filter(pred) is equivalent in intent to constructing a filter_view over views::all(r) with pred.
The predicate is part of the view object’s state. Mutating external state captured by the predicate affects later iterations through the same view.
filter_view always models input_range. It models forward_range, bidirectional_range, and common_range when the underlying view models those concepts.
It does not provide random-access traversal because advancing requires predicate checks and possible skipping.
For forward underlying ranges, implementations may cache the first matching position to make repeated begin() calls efficient.
| Area | Key entries |
|---|---|
| View type and adaptor object | std::ranges::filter_view, std::ranges::views::filter |
| Iterator surface | filter_view::iterator, filter_view::sentinel |
| Related ranges machinery | range adaptor closure, viewable_range, view_interface |
| Adjacent views | take_while_view / views::take_while, transform_view / views::transform |
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3714(P2711R1) | C++20 | the multi-parameter constructor was not explicit | made explicit |
| P2325R3 | C++20 | if Pred is not default_initializable, the default constructor produced a filter_view that did not contain a Pred | filter_view is also not default-initializable in that case |
This hub groups the ranges library by user task rather than by raw reference tree shape. View types and adaptor objects are presented as the same conceptual item.
Start here for the adapters most people reach for first when building pipelines.
Apply a function to each element lazily.
Keep only elements that satisfy a predicate.
Keep the first N elements from a source range.
Skip the first N elements and expose the rest.
Split a range into non-overlapping fixed-size subranges.
Flatten a range of ranges into a single lazy sequence.
These adapt shape, ownership, or projection rather than representing the “headline” pipeline steps.
Normalize a range into a view-compatible form.
Adapt iterator/sentinel pairs into a common-range shape.
Wrap an existing range by reference.
Store and expose a range with unique ownership.
Package iterator + sentinel as a view-like object.
Project tuple-like elements to their key component.
Project tuple-like elements to their value component.
Newer adapters, kept as a compact scan list with only standard badges.
A lighter-weight index of the full ranges surface, grouped by conceptual task instead of raw page-tree names.