2010-11-26 9 views
18

나는 내가 정의한 비교 함수를 기반으로 정렬 된 unordered_map의 벡터를가집니다. 이진 검색을 사용하여 비교 함수를 사용하여 값 중 하나를 찾으려고합니다. 그러나 이진 검색은 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,6,7}. 가운데는 5 점으로 가치가 있습니다. 그러나 lower_bound는 왼쪽으로 갈 것입니다. 그것은 최적이 아닙니다. 나는 왼쪽 경계를 찾는 O (Log (N)) 해법을 가정 할 수있다. 그러나 그것은 과잉입니다. 나는 매우 화가났다. 그러나 C 함수 :: bsearch가 있습니다. – cppist

+0

'! = a.end()'인 경우'! cmp (* it, value)'는 항상 true입니다. 인수를 바꾸어야합니다. – Ruslan

15
#include <algorithm> 
using namespace std; 

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

일 또는 가능 UPPER_BOUND 또는 반드시 요소를 반환하지 않습니다 –

+2

-1 LOWER_BOUND을 equal_range. 요소가없는 경우 요소가 벡터에 있기 전에 요소를 반환합니다. – T33C

+1

lower_bound를 사용하는 것이 좋습니다. iterator를 가져 와서 역 참조가 가능한지 확인하십시오. 일치하는 경우 참조를 취소하고 검색된 요소를 확인하십시오. 그것이 요소라면, 당신은 그것을 가지고 있습니다. 그렇지 않으면 거기에 없습니다. –