Файл заголовка 'boost/algorithm/cxx11/one_of.hpp' содержит четыре варианта одного алгоритма,<one_of
>. Алгоритм проверяет элементы последовательности и возвращает истинность, если точно один из элементов в последовательности имеет конкретное свойство.
Распорядок<one_of
>принимает последовательность и предикат. Он вернется истинным, если предикат вернется истинным для одного элемента в последовательности.
Рутина<one_of_equal
>принимает последовательность и значение. Он вернется истинным, если один элемент в последовательности сравнивается с пройденным значением.
Обе процедуры бывают двух форм; первая требует двух итераторов для определения диапазона. Вторая форма принимает один параметр диапазона и использует Boost. Диапазон, чтобы пройти его.
Функция<one_of
>возвращается истинной, если предикат возвращается истинным для одного элемента в последовательности. Есть две версии: одна занимает два итератора, а другая занимает диапазон.
namespace boost { namespace algorithm {
template<typename InputIterator, typename Predicate>
bool one_of ( InputIterator first, InputIterator last, Predicate p );
template<typename Range, typename Predicate>
bool one_of ( const Range &r, Predicate p );
}}
Функция<one_of_equal
>похожа на<one_of
>, но вместо того, чтобы взять предикат для проверки элементов последовательности, требуется значение для сравнения.
namespace boost { namespace algorithm {
template<typename InputIterator, typename V>
bool one_of_equal ( InputIterator first, InputIterator last, V const &val );
template<typename Range, typename V>
bool one_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;
one_of ( c, isOdd ) --> false
one_of ( c.begin (), c.end (), lessThan10 ) --> false
one_of ( c.begin () + 3, c.end (), lessThan10 ) --> true
one_of ( c.end (), c.end (), isOdd ) --> false
one_of_equal ( c, 3 ) --> true
one_of_equal ( c.begin (), c.begin () + 3, 3 ) --> false
one_of_equal ( c.begin (), c.begin (), 99 ) --> false
<one_of
>и<one_of_equal
>работают на всех итераторах, кроме выходных итераторов.
Все варианты<one_of
>и<one_of_equal
>работают вO(N)(линейное) время; то есть они сравниваются с каждым элементом в списке один раз. Если более чем один из элементов в последовательности удовлетворяет условию, то алгоритм немедленно вернет ложное, не изучив остальные члены последовательности.
Все варианты<one_of
>и<one_of_equal
>берут свои параметры по стоимости или по ссылке и не зависят от какого-либо глобального состояния. Таким образом, все процедуры в этом файле обеспечивают сильную гарантию исключения.
- <
one_of
>и<one_of_equal
>оба возвращают ложные для пустых диапазонов, независимо от того, что было передано для проверки. - Второй параметр<
one_of_equal
>является шаблонным параметром, а не выведенным из первого параметра<std::iterator_traits<InputIterator>::value_type
>, поскольку он обеспечивает большую гибкость для абонентов и использует встроенные сравнения для типа, на который указывает итератор. Функция определяется как возвращающая истинность, если для одного элемента в последовательности выражение<*iter==val
>оценивает истинность (где<iter
>является итератором для каждого элемента в последовательности).