bool binary_search( ForwardIt first, ForwardIt last,
<ForwardIt>::value_type >
constexpr bool binary_search( ForwardIt first, ForwardIt last,
bool binary_search( ForwardIt first, ForwardIt last,
<ForwardIt>::value_type,
class Compare >
constexpr bool binary_search( ForwardIt first, ForwardIt last,
Checks if an element equivalent to value appears within the partitioned range [
first,
last)
.
The equivalence is checked using
operator<:
If !bool(*iter < value) && !bool(value < *iter) is true for some iterator iter in [
first,
last)
, returns true. Otherwise returns false.
If any of the following conditions is satisfied, the behavior is undefined:
[
first,
last)
, bool(elem < value) does not imply !bool(value < elem).[
first,
last)
are not partitioned with respect to expressions bool(elem < value) and !bool(value < elem).Equivalent to std::binary_search(first, last, value, std::less{}).
(since C++20)2) The equivalence is checked using comp:
If !bool(comp(*iter, value)) && !bool(comp(value, *iter)) is true for some iterator iter in [
first,
last)
, returns true. Otherwise returns false.
If any of the following conditions is satisfied, the behavior is undefined:
[
first,
last)
, bool(comp(elem, value)) does not imply !bool(comp(value, elem)).[
first,
last)
are not partitioned with respect to expressions bool(comp(elem, value)) and !bool(comp(value, elem)).The signature of the predicate function should be equivalent to the following:
bool pred(const Type1 &a, const Type2 &b);
While the signature does not need to have const &, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const) Type1
and Type2
regardless of value category (thus, Type1 & is not allowed, nor is Type1 unless for Type1
a move is equivalent to a copy(since C++11)).
The types Type1 and Type2 must be such that an object of type T can be implicitly converted to both Type1 and Type2, and an object of type ForwardIt can be dereferenced and then implicitly converted to both Type1 and Type2. â
ForwardIt
must meet the requirements of LegacyForwardIterator. -Compare
must meet the requirements of BinaryPredicate. It is not required to satisfy Compare. [edit] Return value
true if an element equivalent to value is found, false otherwise.
[edit] ComplexityGiven \(\scriptsize N\)N as std::distance(first, last):
1)At most
\(\scriptsize \log_{2}(N)+O(1)\)log2(N)+O(1)comparisons with
valueusing
operator<(until C++20)std::less{}(since C++20).
2) At most \(\scriptsize \log_{2}(N)+O(1)\)log2(N)+O(1) applications of the comparator comp.
However, if ForwardIt
is not a LegacyRandomAccessIterator, the number of iterator increments is linear in \(\scriptsize N\)N.
Although std::binary_search
only requires [
first,
last)
to be partitioned, this algorithm is usually used in the case where [
first,
last)
is sorted, so that the binary search is valid for any value.
std::binary_search
only checks whether an equivalent element exists. To obtain an iterator to that element (if exists), std::lower_bound should be used instead.
See also the implementations in libstdc++ and libc++.
binary_search (1)template<class ForwardIt, class T = typename std::iterator_traits<ForwardIt>::value_type> bool binary_search(ForwardIt first, ForwardIt last, const T& value) { return std::binary_search(first, last, value, std::less{}); }binary_search (2)
template<class ForwardIt, class T = typename std::iterator_traits<ForwardIt>::value_type, class Compare> bool binary_search(ForwardIt first, ForwardIt last, const T& value, Compare comp) { first = std::lower_bound(first, last, value, comp); return (!(first == last) and !(comp(value, *first))); }[edit] Example
#include <algorithm> #include <cassert> #include <complex> #include <iostream> #include <vector> int main() { const auto haystack = {1, 3, 4, 5, 9}; for (const auto needle : {1, 2, 3}) { std::cout << "Searching for " << needle << '\n'; if (std::binary_search(haystack.begin(), haystack.end(), needle)) std::cout << "Found " << needle << '\n'; else std::cout << "Not found!\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::binary_search(nums.cbegin(), nums.cend(), {4, 2}, cmpz)); #else assert(std::binary_search(nums.cbegin(), nums.cend(), CD{4, 2}, cmpz)); #endif }
Output:
Searching for 1 Found 1 Searching for 2 Not found! Searching for 3 Found 3[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior LWG 270 C++98Compare
was required to satisfy Compare and T
was required
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4