TGViewer
Библиотека C/C++ разработчика | cpp, boost, qt Библиотека C/C++ разработчика | cpp, boost, qt @cppproglib · 16.9K subscribers
Post #6616 1.83K
🍿 std::views::filter — ленивая фильтрация в C++20

Адаптеры std::views::* — главный инструментарий Ranges. Каждый из них создаёт новое «представление» существующих данных без копирования. Сегодня разберём views::filter.


🌸 Базовое использование

#include <ranges>
#include <vector>
namespace views = std::views;

std::vector<int> nums = {1, -2, 3, -4, 5, -6};

auto positives = nums | views::filter([](int x) { return x > 0; });
// Итерация даёт: 1, 3, 5


Ничего не копируется — positives это просто обёртка поверх nums, которая позволяет удобно обрабатывать его элементы.


🍪 Цепочка фильтров

auto is_even = [](int x) { return x % 2 == 0; };

auto result = nums
| views::filter([](int x) { return x > 0; }) // 1, 3, 5
| views::filter(is_even); // нет чётных → пусто


Фильтры можно комбинировать в произвольную цепочку. Вычисление происходит лениво — только в момент итерации.


👻 Композиция с views::transform

Достаточно просто ограничить обработку только тех элементов, которые хотим обработать:

auto squares = nums
| views::filter([](int x) { return x > 0; })
| views::transform([](int x) { return x * x; });
// Итерация даёт: 1, 9, 25



🍙 Материализация в вектор

View — это не контейнер. Чтобы получить std::vector необходимо явно дать указание, что мы хотим привести результат к вектору:

// C++23
auto vec = nums | views::filter(is_even)
| std::ranges::to<std::vector>();

// C++20
std::vector<int> vec(result.begin(), result.end());



🌱 Pipe-синтаксис vs явный тип

Синтаксис в виде pipe удобе, но если необходимо (например, для шаблонов), то можно пользоваться диапазонами как типами/объетами. Обе записи идентичны:

auto v1 = nums | views::filter(is_even);
auto v2 = std::ranges::filter_view{nums, is_even};



❗️ Ловушка: dangling view

// UB — вектор уничтожен после точки с запятой
auto bad = std::vector{1, 2, 3} | views::filter(is_even);

// Правильно — храните источник данных отдельно
std::vector<int> data = {1, 2, 3};
auto ok = data | views::filter(is_even);



🐸 Продолжение следует...

📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#константная_правильность
  • 👍 11
  • 🔥 2
  • ❤ 1
More from @cppproglib
  1. Sep 19, 2026А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tp…
  2. Sep 18, 2026От исходного кода до процессора: разберись, как работает программа 💻 Стартует практически…
  3. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  4. Sep 13, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  5. Sep 13, 2026🤩 Inline static в классах — забудь про .cpp Сколько раз ты забывал добавить определение s…
  6. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →