2010-11-26 6 views
18

私は定義した比較関数に基づいてソートされたunordered_mapのベクトルを持っています。バイナリ検索を使用して、比較関数を使用して値の1つを探したいと思います。しかし、バイナリ検索はboolだけを返すので、結果のインデックス/イテレータが必要です。私は何ができますか?バイナリサーチC++ STL

答えて

22
#include <algorithm> 
using namespace std; 

//!!!!! a must be sorted using cmp. Question indicates that it is.   
it = lower_bound(a.begin, a.end(), value, cmp); 

//Check that we have actually found the value. 
//If the requested value is missing 
//then we will have the value before where the requested value 
//would be inserted. 
if(it == a.end() || !cmp(*it, value)) 
{ 
    //element not found 
} 
else 
{ 
    //element found 
} 
+2

lower_boundは単純な「任意の一致する値」よりもはるかに遅いようです。 {1,2,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5、 5,5,6,7}。 真ん中は5であり、価値が求められています。しかしlower_boundは残っています。それは最適ではない。私は左境界を見つけるO(Log(N))解と仮定できます。しかしそれは過剰です。私はこれを非常にうんざりしています。しかし、C関数:: bsearchがあります。 – cppist

+0

'it!= a.end()'なら '!cmp(* it、value)'は常に真です。引数を逆にする必要があります。 – Ruslan

15
#include <algorithm> 
using namespace std; 

it = lower_bound(a.begin, a.end(), value, cmp); 
+3

+1またはおそらくはUPPER_BOUND又はequal_range –

+2

-1 LOWER_BOUNDは必ずしも要素を返しません。要素が欠落している場合は、要素がベクトルに含まれる前に要素を戻します。 – T33C

+1

lower_boundを使用するのは賢明です。イテレータを取って、逆参照できないかどうか確認してください。そうであれば、逆参照し、検索された要素で確認してください。それが要素なら、あなたはそれを持っています。そうでなければ、そこにはありません。 –