binary_search in c++ unexpected behaviour

前端 未结 4 821
暖寄归人
暖寄归人 2021-01-25 13:41

The following snippet is returning me 0. I expected it to be 1. What\'s wrong going on here?

#include 
#include 
#include 

        
相关标签:
4条回答
  • 2021-01-25 14:15

    "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.

    0 讨论(0)
  • 2021-01-25 14:23

    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)

    1. 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).
    0 讨论(0)
  • 2021-01-25 14:35

    binary_search says:

    Checks if the sorted range [first, last) contains an element equal to value. The first version uses operator< to compare the elements, the second version uses the given comparison function comp.

    Your list is not sorted, it contains the elements 11 and 22 prior to 10.

    0 讨论(0)
  • 2021-01-25 14:38

    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.

    0 讨论(0)
提交回复
热议问题