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.

Daily bit(e) C++

Три алгоритма булевой редукции, 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

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование