std::all_of, std::any_of, std::none_of
Материал из cppreference.com
Определено в заголовочном файле <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 & в определении не обязательно, но функция не должна модифицировать передаваемые ей объекты. |
Требования к типам | ||
-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