The following snippet is returning me 0. I expected it to be 1. What\'s wrong going on here?
#include
#include
#include
"Unexpected behavior"? There's nothing unexpected here.
The whole idea of binary search algorithm is taking advantage of the fact that the input array is sorted. If the array is not sorted, there can't be any binary search on it.
When you use std::binary_search
(as well as all other standard binary search-based algorithms), the input sequence must be sorted in accordance with the same comparison predicate as the one used by std::binary_search
. Since you did not pass any custom predicate to std::binary_search
, it will use the ordering defined by <
operator. That means that your input Sequence of integers must be sorted in ascending order.
In your case the input sequence does not satisfy that requirement. std::binary_search
cannot be used on it.
Your array is not sorted, so binary_search
got undefined behavior. Try std::find
instead
bool found = std::find(v.begin(), v.end(), 10) != v.end()
§25.4.3.4 of the C++11 standard (3242 draft)
- Requires: The elements e of [first,last) are partitioned with respect to the expressions e < value and !(value < e) or comp(e, value) and !comp(value, e). Also, for all elements e of [first, last), e < value implies !(value < e) or comp(e, value) implies !comp(value, e).
binary_search says:
Checks if the sorted range
[first, last)
contains an element equal tovalue
. The first version usesoperator<
to compare the elements, the second version uses the given comparison functioncomp
.
Your list is not sorted, it contains the elements 11
and 22
prior to 10
.
I ran the program and saw this:
11
22
10
20
30
40
50
Binary Search - 0
Your array is not sorted, therefore, binary search fails. (it sees 11
in the first position, and concludes 10
does not exist here)
You either want to ensure the array is sorted before binary searching or use the regular std::find
.