Ежедневный бит (е) 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}