اگر vector سورت شدست std::binary_search برای تعداد بالا (مثلا بیشتر از 20 تا ) به مراتب سرعت بالاتری داره چون بر خلاف find که از مرتبه n هست از مرتبه logn هست . البته find از نظر caching مناسب تره (چون بصورت ترتیببی به عناصر دسترسی پیدا می کنیم بر خلاف binary_search که هر بار عنصر وسط بازه مقایسه میشه )
در سی پلاس پلاس binary_search از نظر عملکرد با find فرق داره مقدار بازگشتی binarry_search درست یا غلط هست در حالی که find محل عنصر پیدا شده رو بر می گردونه . برای عملکرد مشابه میشه از
equal_Range استفاده کرد.
برای پیاده سازی find داخل ویژوال استودیو از 2 تابع استفاده شده :
template<class _InIt,
class _Ty> inline
_InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val, false_type)
{ // find first matching _Val
for (; _First != _Last; ++_First)
if (*_First == _Val)
break;
return (_First);
}
همون طوری که مشخصه کاملا بصورت خطی جست و جو انجام میشه .(از عنصر اول تا آخر یکی یکی مقایسه میشه )
یکی هم مربوط به char و bool
template<class _InIt,
class _Ty> inline
_InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val, true_type)
{ // find first byte matching integral _Val
if (!_Within_limits(_First, _Val))
return (_Last);
_First = static_cast<_InIt>(_CSTD memchr(
_First, static_cast<unsigned char>(_Val), _Last - _First));
return (_First ? _First : _Last);
}
برای char و bool به جای مقایسه جدا جدای تک تک char ها از تابع memchr برای مقایسه کل رنج حافظه نظر بصورت یکجا استفاده میشه که باز هم خطی هست