Пространства имён
Варианты
Действия

std::all_of, std::any_of, std::none_of

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
all_of
any_of
none_of
(C++11)
(C++11)
(C++11)
for_each
count
count_if
mismatch
equal
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Определено в заголовочном файле <algorithm>
template< class InputIt, class UnaryPredicate >
bool all_of( InputIt first, InputIt last, UnaryPredicate p );
(1) (начиная с C++11)
template< class InputIt, class UnaryPredicate >
bool any_of( InputIt first, InputIt last, UnaryPredicate p );
(2) (начиная с C++11)
template< class InputIt, class UnaryPredicate >
bool none_of( InputIt first, InputIt last, UnaryPredicate p );
(3) (начиная с C++11)
1) Проверяет, что предикат p возвращает значение true для всех элементов в диапазоне [first, last).
2) Проверяет, что предикат p возвращает значение true для хотя бы одного элемента в диапазоне [first, last).
3) Проверяет, что предикат p не возвращает значение true ни для одного элемента в диапазоне [first, last).

Содержание

[править] Параметры

first, last - диапазон элементов для проверки
p - унарный предикат.

Определение функции предиката должны быть эквивалентно следующему:

 bool pred(const Type &a);

Определение не должно иметь const &, но функция не должна модифицировать принимаемые объекты.
Тип Type должен быть таков, что объект типа InputIt может быть разыменован и затем неявно преобразован в Type. ​

Требования к типам
-
InputIt должен соответствовать требованиям InputIterator.
-
UnaryPredicate должен соответствовать требованиям Predicate.

[править] Возвращаемое значение

1) true, если унарный предикат возвращает true для всех элементов в диапазоне, иначе false. Возвращает true, если диапазон пуст.
2) true, если унарный предикат возвращает true для хотя бы одного элемента в диапазоне, иначе false. Возвращает false, если диапазон пуст.
3) true, если унарный предикат не возвращает true ни для одного элемента в диапазоне, иначе false. Возвращает true, если диапазон пуст.

[править] Сложность

Не больше last - first применений предиката.

[править] Возможная реализация

Первый вариант
template< class InputIt, class UnaryPredicate >
bool all_of(InputIt first, InputIt last, UnaryPredicate p)
{
    for (; first != last; ++first) {
        if (!p(*first)) return false;
    }
    return true;
}
Второй вариант
template< class InputIt, class UnaryPredicate >
bool any_of(InputIt first, InputIt last, UnaryPredicate p)
{
    for (; first != last; ++first) {
        if (p(*first)) return true;
    }
    return false;
}
Третий вариант
template< class InputIt, class UnaryPredicate >
bool none_of(InputIt first, InputIt last, UnaryPredicate p)
{
    for (; first != last; ++first) {
        if (p(*first)) return false;
    }
    return true;
}

[править] Пример

#include <vector>
#include <numeric>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <functional>
 
int main()
{
    std::vector<int> v(10, 2);
    std::partial_sum(v.cbegin(), v.cend(), v.begin());
    std::cout << "Среди чисел: ";
    std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
 
    if (std::all_of(v.cbegin(), v.cend(), [](int i){ return i % 2 == 0; })) {
        std::cout << "Все числа чётные\n";
    }
    if (std::none_of(v.cbegin(), v.cend(), std::bind(std::modulus<int>(),
                                                     std::placeholders::_1, 2))) {
        std::cout << "Ни одно из них не нечётное\n";
    }
    struct DivisibleBy
    {
        const int d;
        DivisibleBy(int n) : d(n) {}
        bool operator()(int n) const { return n % d == 0; }
    };
 
    if (std::any_of(v.cbegin(), v.cend(), DivisibleBy(7))) {
        std::cout << "По крайней мере одно из чисел делится на 7\n";
    }
}

Вывод:

Среди чисел: 2 4 6 8 10 12 14 16 18 20
Все числа чётные
Ни одно из них не нечётное
По крайней мере одно из чисел делится на 7