Daily bit(e) C++. std::all_of, std::any_of, std::none_of
Добавлено 27 июля 2026 в 23:07
Daily bit(e) C++ 45, три алгоритма булевой редукции: std::all_of, std::any_of и std::none_of.

Три алгоритма булевой редукции, std::all_of, std::any_of и std::none_of, предоставляют соответствующие булевы редукции поверх унарного предиката.
В то время как std::all_of и std::none_of возвращают true для пустых диапазонов, std::any_of требует положительного наличия и вернет false для пустого диапазона.
У алгоритмов есть как параллельная версия в C++17, так и версия для диапазонов в C++20.
#include <vector>
#include <algorithm>
std::vector<int> data{2, 2, 2, 4, 6, 8};
auto is_even = [](int v) { return v % 2 == 0; };
auto is_odd = [](int v) { return v % 2 != 0; };
auto is_double_digit = [](int v) { return v > 9 && v < 100; };
bool r1 = std::all_of(data.begin(), data.end(), is_even);
// r1 == true
bool r2 = std::none_of(data.begin(), data.end(), is_odd);
// r2 == true
bool r3 = std::any_of(data.begin(), data.end(), is_double_digit);
// r3 == false
std::vector<bool> flags{true, true, false};
// Если элементы уже преобразуются в bool,
// мы можем использовать std::identity{} вместо предиката
bool r4 = std::all_of(flags.begin(), flags.end(), std::identity{});
// r4 == false
struct Custom { int v; };
std::vector<Custom> nested{{4},{2},{0}};
// с проекцией
bool r5 = std::ranges::any_of(nested, is_even, &Custom::v);
// r5 == true
