Library: Algorithms
Function
Algorithm that performs a binary search for a value
#include <algorithm>
namespace std {
template <class ForwardIterator, class T>
bool
binary_search(ForwardIterator start, ForwardIterator finish,
const T& value);
template <class ForwardIterator, class T, class Compare>
bool
binary_search(ForwardIterator start, ForwardIterator finish,
const T& value, Compare comp);
}
The binary_search() algorithm, like the related algorithms equal_range(), lower_bound(), and upper_bound(), performs a binary search on a range of ordered values. All binary search algorithms have two variations. The first variation uses the operator< to perform the comparison, and assumes that the sequence has been sorted using that operator. The second variation allows you to specify a function object of type Compare, which it assumes was the function used to sort the sequence. The function object must be a binary predicate.
The binary_search() algorithm returns true if a sequence contains an element equivalent to the argument value. The first variation of binary_search() returns true if the sequence contains at least one element that is equal to the search value. The second variation of the binary_search() algorithm returns true if the sequence contains at least one element that satisfies the conditions of the comparison function. Formally, binary_search() returns true if there is an iterator i in the range [start, finish) that satisfies the corresponding conditions:
!(*i < value) && !(value < *i)
or
comp(*i, value) == false && comp(value, *i) == false
binary_search() performs at most log(finish - start) + 2 comparisons.
//
// b_search.cpp
//
#include <algorithm> // for copy, sort
#include <deque> // for deque
#include <functional> // for less
#include <iostream> // for cout, endl, ostream_iterator
int main ()
{
// Typedefs for convenience.
typedef std::deque<short, std::allocator<short> > deque;
typedef std::ostream_iterator<deque::value_type, char,
std::char_traits<char> > os_iter;
const deque::value_type arr[] = {
0, 1, 2, 2, 3, 4, 2, 2, 6, 7
};
// Populate and sort the container.
deque d (arr + 0, arr + sizeof arr / sizeof *arr);
std::sort (d.begin (), d.end ());
// Try binary_search variants.
bool b1 = std::binary_search (d.begin (), d.end (), 3);
bool b2 = std::binary_search (d.begin (), d.end (), 11,
std::less<int>());
// Output results.
std::cout << "Container contents: ";
std::copy (d.begin (), d.end (),
os_iter (std::cout, " "));
std::cout << "\nThe number 3 was "
<< ("NOT found" + b1 * 4);
std::cout << "\nThe number 11 was "
<< ("NOT found" + b2 * 4) << std::endl;
return 0;
}
Program Output:
Container contents: 0 1 2 2 2 2 3 4 6 7
The number 3 was found
The number 11 was NOT found
equal_range(), lower_bound(), upper_bound()
ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 25.3.3.4