2010-11-26 35 views
18

Tanımladığım karşılaştırma işlevi temelinde sıralanmış bir unordered_map vektörüm var. Karşılaştırma işlevini kullanarak değerlerden birini aramak için ikili aramayı kullanmak istiyorum. Ancak, ikili arama sadece boole döndürür ve sonucun indeksine/yineleyicisine ihtiyacım var. Ne yapabilirdim?İkili Arama C++ STL

cevap

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, "eşleşen herhangi bir değerden" çok daha yavaş görünüyor. Varsayalım {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,6,7}. Orta 5 - aranan bir değer. Ancak lower_bound sola gidecek. Bu inoptimal. O (Log (N)) sol sınır bulma çözümünü düşünebilirim. Ama fazladır. Bundan çok üzüldüm. Ancak bir C işlevi :: bsearch var. – cppist

+0

'! Cmp (* it, value)', her zaman, eğer! Argümanları tersine çevirmelisin. – Ruslan

15
#include <algorithm> 
using namespace std; 

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

+1 ya da muhtemelen UPPER_BOUND ya da zorunlu elemanı döndürmez –

+2

-1 LOWER_BOUND equal_range. Eğer eleman eksikse, elemanın vektörde olmasından önce dönmeden dönecektir. – T33C

+1

hala low_bound kullanmak akıllıca. Yineleyiciyi alın, kabul edilemez olup olmadığını kontrol edin. Eğer öyleyse, onu seçin ve aranan eleman ile kontrol edin. Eğer öyleyse, sizde var, o orada değil. –