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))returnfalse;}returntrue;} |
Второй вариант |
template<class InputIt, class UnaryPredicate >bool any_of(InputIt first, InputIt last, UnaryPredicate p){for(; first != last;++first){if(p(*first))returntrue;}returnfalse;} |
Третий вариант |
template<class InputIt, class UnaryPredicate >bool none_of(InputIt first, InputIt last, UnaryPredicate p){for(; first != last;++first){if(p(*first))returnfalse;}returntrue;} |
[править]Пример
Запустить этот код
#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 {constint 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