1、std::binary_search内部用std::lower_bound来进行查询。
2、std::binary_search只在精确查到指定的值的时候才返回true,而std::lower_bound不是
3、std::binary_search只给出是不是存在这个值,但不告诉你这个值的位置。而std::lower_bound会返回位置,但不一定是这个值,lower_bound是根据查询规则来返回位置
std::lower_bound查询到的只是第一个不满足查询条件的那个值,但和你要查的那个值不一定相等,所以binary_search在最后又用!_Pred(_Val, *_UFirst)进行反向判断。
一句就是:
bool b0=!(a<b);
bool b1=!(b<a);
if(b0 && b1){ printf("a==b"); }
简述就是:如果a不小于b,并且b又不小于a,那么a和b相等。
反映到binary_search上就是,!_Pred(*_UFirst, _Val) 和!_Pred(_Val, *_UFirst)均为true,那么就是要找的那个值了。
因为std::lower_bound里,满足查询结果的就是第一个!_Pred(*_UFirst, _Val) 为true的,所以再检查一下!_Pred(_Val, *_UFirst)就行了。
// FUNCTION TEMPLATE binary_search
template<class _FwdIt,
class _Ty,
class _Pr>
_NODISCARD inline bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val, _Pr _Pred)
{ // test if _Val equivalent to some element, using _Pred
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);
_UFirst = _STD lower_bound(_UFirst, _ULast, _Val, _Pass_fn(_Pred));
return (_UFirst != _ULast && !_Pred(_Val, *_UFirst));
}