Namespaces
Variants

std::ranges:: binary_search

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
Определено в заголовке <algorithm>
Сигнатура вызова
(1)
template < std:: forward_iterator I, std:: sentinel_for < I > S,

class T, class Proj = std:: identity ,
std:: indirect_strict_weak_order
< const T * , std :: projected < I, Proj >> Comp = ranges:: less >
constexpr bool binary_search ( I first, S last, const T & value,

Comp comp = { } , Proj proj = { } ) ;
(начиная с C++20)
(до C++26)
template < std:: forward_iterator I, std:: sentinel_for < I > S,

class Proj = std:: identity ,
class T = std :: projected_value_t < I, Proj > ,
std:: indirect_strict_weak_order
< const T * , std :: projected < I, Proj >> Comp = ranges:: less >
constexpr bool binary_search ( I first, S last, const T & value,

Comp comp = { } , Proj proj = { } ) ;
(начиная с C++26)
(2)
template < ranges:: forward_range R,

class T, class Proj = std:: identity ,
std:: indirect_strict_weak_order
< const T * , std :: projected < ranges:: iterator_t < R > ,
Proj >> Comp = ranges:: less >
constexpr bool binary_search ( R && r, const T & value,

Comp comp = { } , Proj proj = { } ) ;
(начиная с C++20)
(до C++26)
template < ranges:: forward_range R,

class Proj = std:: identity ,
class T = std :: projected_value_t < ranges:: iterator_t < R > , Proj > ,
std:: indirect_strict_weak_order
< const T * , std :: projected < ranges:: iterator_t < R > ,
Proj >> Comp = ranges:: less >
constexpr bool binary_search ( R && r, const T & value,

Comp comp = { } , Proj proj = { } ) ;
(начиная с C++26)
1) Проверяет, появляется ли спроецированный элемент, эквивалентный value в диапазоне [ first , last ) .
2) То же, что и (1) , но использует r в качестве исходного диапазона, как если бы использовались ranges:: begin ( r ) в качестве first и ranges:: end ( r ) в качестве last .

Для успешного выполнения ranges::binary_search диапазон [ first , last ) должен быть хотя бы частично упорядочен относительно value , т.е. должны выполняться все следующие требования:

  • разделено относительно std:: invoke ( comp, std:: invoke ( proj, element ) , value ) (то есть все проецируемые элементы, для которых выражение true предшествует всем элементам, для которых выражение false ).
  • разделено относительно ! std:: invoke ( comp, value, std:: invoke ( proj, element ) ) .
  • для всех элементов, если std:: invoke ( comp, std:: invoke ( proj, element ) , value ) равно true , тогда ! std:: invoke ( comp, value, std:: invoke ( proj, element ) ) также равно true .

Полностью отсортированный диапазон удовлетворяет этим критериям.

Функциональные сущности, описанные на этой странице, являются алгоритмическими функциональными объектами (неформально известными как niebloids ), то есть:

Содержание

Параметры

first, last - пара итератор-страж, определяющая диапазон элементов для проверки
r - диапазон элементов для проверки
value - значение для сравнения с элементами
comp - функция сравнения, применяемая к проецируемым элементам
proj - проекция, применяемая к элементам

Возвращаемое значение

true если найден элемент, равный value , false в противном случае.

Сложность

Количество сравнений и проекций, выполняемых алгоритмом, логарифмически зависит от расстояния между first и last (не более log 2 (last - first) + O(1) сравнений и проекций). Однако для пар итератор-страж, которые не моделируют std::random_access_iterator , количество инкрементов итераторов является линейным.

Примечания

std::ranges::binary_search не возвращает итератор на найденный элемент при обнаружении элемента, чья проекция равна value . Если требуется получить итератор, следует использовать std::ranges::lower_bound вместо этого.

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_algorithm_default_value_type 202403 (C++26) Списочная инициализация для алгоритмов ( 1,2 )

Возможная реализация

struct binary_search_fn
{
    template<std::forward_iterator I, std::sentinel_for<I> S,
             class Proj = std::identity, class T = std::projected_value_t<I, Proj>,
             std::indirect_strict_weak_order
                 <const T*, std::projected<I, Proj>> Comp = ranges::less>
    constexpr bool operator()(I first, S last, const T& value,
                              Comp comp = {}, Proj proj = {}) const
    {
        auto x = ranges::lower_bound(first, last, value, comp, proj);
        return (!(x == last) && !(std::invoke(comp, value, std::invoke(proj, *x))));
    }
    template<ranges::forward_range R, class Proj = std::identity,
             class T = std::projected_value_t<ranges::iterator_t<R>, Proj>,
             std::indirect_strict_weak_order
                 <const T*, std::projected<ranges::iterator_t<R>,
                                           Proj>> Comp = ranges::less>
    constexpr bool operator()(R&& r, const T& value, Comp comp = {}, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), value,
                       std::move(comp), std::move(proj));
    }
};
inline constexpr binary_search_fn binary_search;

Пример

#include <algorithm>
#include <cassert>
#include <complex>
#include <iostream>
#include <ranges>
#include <vector>
int main()
{
    constexpr static auto haystack = {1, 3, 4, 5, 9};
    static_assert(std::ranges::is_sorted(haystack));
    for (const int needle : std::views::iota(1)
                          | std::views::take(3))
    {
        std::cout << "Поиск " << needle << ": ";
        std::ranges::binary_search(haystack, needle)
            ? std::cout << "найдено " << needle << '\n'
            : std::cout << "не найдено!\n";
    }
    using CD = std::complex<double>;
    std::vector<CD> nums{{1, 1}, {2, 3}, {4, 2}, {4, 3}};
    auto cmpz = [](CD x, CD y){ return abs(x) < abs(y); };
    #ifdef __cpp_lib_algorithm_default_value_type
        assert(std::ranges::binary_search(nums, {4, 2}, cmpz));
    #else
        assert(std::ranges::binary_search(nums, CD{4, 2}, cmpz));
    #endif
}

Вывод:

Поиск 1: найдено 1
Поиск 2: не найдено!
Поиск 3: найдено 3

Смотрите также

возвращает диапазон элементов, соответствующих заданному ключу
(функциональный объект алгоритма)
возвращает итератор к первому элементу не меньшему заданного значения
(функциональный объект алгоритма)
возвращает итератор к первому элементу большему заданного значения
(функциональный объект алгоритма)
проверяет, содержит ли диапазон заданный элемент или поддиапазон
(функциональный объект алгоритма)
определяет, существует ли элемент в частично упорядоченном диапазоне
(шаблон функции)