Файл заголовка 'boost/algorithm/cxx11/none_of.hpp' содержит четыре варианта одного алгоритма,
. Алгоритм проверяет все элементы последовательности и возвращает истинность, если ни один из них не имеет общего свойства.
Обычная жизньНикто
берет последовательность и предикат. Он вернётся истинным, если предикат вернётся ложным при нанесении на каждый элемент в последовательности.
ни один из
не принимает последовательность и значение. Оно вернётся истинным, если ни один из элементов в последовательности не сравнится с пройденным значением.
Обе процедуры бывают двух форм; первая требует двух итераторов для определения диапазона. Вторая форма принимает один параметр диапазона и использует Boost. Диапазон, чтобы пройти его.
Функцияno_of
возвращается истинной, если предикат возвращается ложным для каждого элемента в последовательности. Есть две версии: одна занимает два итератора, а другая занимает диапазон.
namespace boost { namespace algorithm {
template<typename InputIterator, typename Predicate>
bool none_of ( InputIterator first, InputIterator last, Predicate p );
template<typename Range, typename Predicate>
bool none_of ( const Range &r, Predicate p );
}}
Функцияno_of_equal
подобнаno_of
, но вместо того, чтобы взять предикат для проверки элементов последовательности, требуется значение для сравнения.
namespace boost { namespace algorithm {
template<typename InputIterator, typename V>
bool none_of_equal ( InputIterator first, InputIterator last, V const &val );
template<typename Range, typename V>
bool none_of_equal ( const Range &r, V const &val );
}}
Дано контейнерc
, содержащий0,1,2,3,14,15
, затем
bool isOdd ( int i ) { return i % 2 == 1; }
bool lessThan10 ( int i ) { return i < 10; }
using boost::algorithm;
none_of ( c, isOdd ) --> false
none_of ( c.begin (), c.end (), lessThan10 ) --> false
none_of ( c.begin () + 4, c.end (), lessThan10 ) --> true
none_of ( c.end (), c.end (), isOdd ) --> true
none_of_equal ( c, 3 ) --> false
none_of_equal ( c.begin (), c.begin () + 3, 3 ) --> true
none_of_equal ( c.begin (), c.begin (), 99 ) --> true
никто
иникто
не работает на всех итераторах, кроме выходных итераторов.
Все вариантыno_of
иno_of_equal
работают вO(N)(линейное) время; то есть они сравниваются с каждым элементом в списке один раз. Если какое-либо из сравнений увенчается успехом, алгоритм прекратит работу немедленно, не изучая оставшиеся элементы последовательности.
Все вариантыno_of
иno_of_equal
берут свои параметры по величине или по ссылке и не зависят от какого-либо глобального состояния. Таким образом, все процедуры в этом файле обеспечивают сильную гарантию исключения.
- Обычный
no_of
также доступен как часть стандарта C++11. ни один
ини один
не возвращаются истинными для пустых диапазонов, независимо от того, против чего проводится испытание.- Второй параметр
no_of_value
является шаблонным параметром, а не выведен из первого параметраstd::iterator_traits<InputIterator>::value_type
, поскольку это обеспечивает большую гибкость для абонентов и использует встроенные сравнения для типа, на который указывает итератор. Функция определяется как возвращающая истинность, если для всех элементов в последовательности выражение*iter==val
оценивается как ложное (гдеiter
является итератором для каждого элемента в последовательности)