Ежедневный бит (е) C++ # 188, Представление фильтрации элементов C++ 20: std::views::filter.

C++20 std::views::filter создает представление элементов из базового диапазона, которые удовлетворяют предоставленному предикату (пропуская те, которые не удовлетворяют).

Представление моделирует двунаправленный диапазон (на основе свойств базового диапазона) и поддерживает общий интерфейс диапазона (если он предоставляется базовым диапазоном).

#include <ranges>
#include <algorithm>
#include <vector>

std::vector<int> data{1,2,3,4,5,6,7};

auto filtered = data | std::views::filter([](int v) {
    return v % 2 == 0;
});
// filtered is a bidirectional common range
std::vector<int> out(filtered.begin(), filtered.end());
// out == {2,4,6}

auto uncommon = std::views::iota(1) | std::views::take(7) | 
    std::views::filter([](int v) {
        return v % 2 == 0;
    });
// uncommon is a bidirectional uncommon range

// Wouldn't compile (requires a common range)
// std::vector<int> out2(uncommon.begin(), uncommon.end());

std::vector<int> out3;
std::ranges::copy(uncommon, std::back_inserter(out3));
// out3 == {2,4,6}

Откройте пример в Compiler Explorer.