Поделиться через


binary_search

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

template<class ForwardIterator, class Type> 
   bool binary_search( 
      ForwardIterator first,  
      ForwardIterator last, 
      const Type& value 
   ); 
template<class ForwardIterator, class Type, class BinaryPredicate> 
   bool binary_search( 
      ForwardIterator first,  
      ForwardIterator last, 
      const Type& value,  
      BinaryPredicate comp 
   );

Параметры

  • first
    Прямой итератор, обращающийся к положению первого элемента в рассматриваемом диапазоне.

  • last
    Прямой итератор, обращающийся к положению первого после элемента после последнего в рассматриваемом диапазоне.

  • value
    Значение требуется, чтобы соответствовало значению элемента или, должно соответствовать условию со значением элемента, заданному двоичным предикатом.

  • comp
    Определяемый пользователем объект функции предиката, который определяет, в каком смысле один элемент меньше другого. Двоичный предикат принимает два аргумента и возвращает true, если он удовлетворяется, и false, если не удовлетворяется.

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

Значение true, если элемент найден в диапазоне, который равен или эквивалентен указанному значению; в противном случае — значение false.

Заметки

Сортируемый указанный диапазон источника должен быть допустимым; все указатели должны поддерживать удаление ссылок и до последней позиции должно быть можно добраться от первой путем инкрементного увеличения.

Сортируемый диапазон для каждого расположения вызове функции-члена в приложение алгоритма binary_search в соответствии с тем же заказу, для использования алгоритма для сортировки диапазонами.

Диапазоны источника не меняются binary_search.

Типы значений итераторов пересылки должны быть сравнимы "меньше чем", чтобы можно было их упорядочить. Таким образом, если имеется два элемента, может быть определено, что они равны (ни один не меньше другого) или что один меньше другого. Это приводит к упорядочению неравнозначных элементов

Сложность алгоритма является логарифмической для итераторов с произвольным доступом и линейной в противном случае, с числом шагов, пропорциональным значению (last — first).

Пример

// alg_bin_srch.cpp
// compile with: /EHsc
#include <list>
#include <vector>
#include <algorithm>
#include <functional>      // greater<int>( )
#include <iostream>

// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser( int elem1, int elem2 )
{
    if (elem1 < 0)
        elem1 = - elem1;
    if (elem2 < 0)
        elem2 = - elem2;
    return elem1 < elem2;
}

int main( )
{
    using namespace std;

    list <int> List1;

    List1.push_back( 50 );
    List1.push_back( 10 );
    List1.push_back( 30 );
    List1.push_back( 20 );
    List1.push_back( 25 );
    List1.push_back( 5 );

    List1.sort();

    cout << "List1 = ( " ;
    for ( auto Iter : List1 )
        cout << Iter << " ";
    cout << ")" << endl;

    // default binary search for 10
    if( binary_search(List1.begin(), List1.end(), 10) )
        cout << "There is an element in list List1 with a value equal to 10."
        << endl;
    else
        cout << "There is no element in list List1 with a value equal to 10."
        << endl;

    // a binary_search under the binary predicate greater
    List1.sort(greater<int>());
    if( binary_search(List1.begin(), List1.end(), 10, greater<int>()) )
        cout << "There is an element in list List1 with a value greater than 10 "
        << "under greater than." << endl;
    else
        cout << "No element in list List1 with a value greater than 10 "
        << "under greater than." << endl;

    // a binary_search under the user-defined binary predicate mod_lesser
    vector<int> v1;

    for( auto i = -2; i <= 4; ++i )
    {
        v1.push_back(i);
    }

    sort(v1.begin(), v1.end(), mod_lesser);

    cout << "Ordered using mod_lesser, vector v1 = ( " ;
    for( auto Iter : v1 )
        cout << Iter << " ";
    cout << ")" << endl;

    if( binary_search(v1.begin(), v1.end(), -3, mod_lesser) )
        cout << "There is an element with a value equivalent to -3 "
        << "under mod_lesser." << endl;
    else
        cout << "There is not an element with a value equivalent to -3 "
        << "under mod_lesser." << endl;
}

Output

List1 = ( 5 10 20 25 30 50 )
There is an element in list List1 with a value equal to 10.
There is an element in list List1 with a value greater than 10 under greater than.
Ordered using mod_lesser, vector v1 = ( 0 -1 1 -2 2 3 4 )
There is an element with a value equivalent to -3 under mod_lesser.

Требования

Заголовок: <algorithm>

Пространство имен: std

См. также

Ссылки

lower_bound

upper_bound

equal_range

Библиотека стандартных шаблонов