2010-11-26 21 views
18

Tengo un vector de unordered_map que se ordena en función de la función del comparador que he definido. Me gustaría usar la búsqueda binaria para buscar uno de los valores usando también la función del comparador. Sin embargo, la búsqueda binaria solo devuelve bool y necesito el índice/iterador del resultado. ¿Qué puedo hacer?Búsqueda binaria C++ STL

Respuesta

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 parece ser mucho más lento que el simple "cualquier valor coincidente". Supongamos {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}. El centro es 5 - un valor buscado. Pero lower_bound irá a la izquierda. Es inóptimo. Supongo que la solución O (Log (N)) para encontrar el límite izquierdo. Pero es un exceso. Estoy muy molesto por esto. Sin embargo, hay una función C :: bsearch. – cppist

+0

'! Cmp (* it, value)' siempre es verdadero si 'it! = A.end()'. Deberías invertir los argumentos. – Ruslan

15
#include <algorithm> 
using namespace std; 

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

+1 o posiblemente upper_bound o equal_range –

+2

-1 LOWER_BOUND no necesariamente devolver el elemento. Si el elemento falta, devolverá el elemento antes de que estuviera si estuviera en el vector. – T33C

+1

es aconsejable usar lower_bound. Tome el iterador, verifique si es eliminable. Si es así, desreferenciarlo y verificar con el elemento buscado. Si es el elemento, lo tienes, de lo contrario no está allí. –