2010-11-26 19 views
18

मेरे पास unordered_map का वेक्टर है जिसे मैंने परिभाषित तुलनात्मक फ़ंक्शन के आधार पर क्रमबद्ध किया है। मैं तुलनात्मक फ़ंक्शन का उपयोग करके मूल्य में से किसी एक को देखने के लिए बाइनरी खोज का उपयोग करना चाहता हूं। हालांकि, बाइनरी खोज केवल बूल लौटाती है और मुझे परिणाम के सूचकांक/पुनरावर्तक की आवश्यकता होती है। मैं क्या कर सकता था?बाइनरी खोज सी ++ एसटीएल

उत्तर

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

निचला_बाउंड सरल "किसी भी मिलान मूल्य" से बहुत धीमा प्रतीत होता है। मान लें {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}। मध्य 5 है - मूल्य के लिए मांगा गया। लेकिन निचला_बाउंड छोड़ा जाएगा। यह अतुलनीय है। मैं बाएं सीमा खोजने के ओ (लॉग (एन)) समाधान का अनुमान लगा सकता हूं। लेकिन यह अतिरिक्त है। मैं इस से बहुत परेशान हूँ। हालांकि एक सी समारोह :: bsearch है। – cppist

+0

'! Cmp (* यह, मान)' हमेशा सही है अगर यह! = A.end() '। आपको तर्कों को उलट देना चाहिए। – Ruslan

15
#include <algorithm> 
using namespace std; 

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

+1 या संभवतः UPPER_BOUND या –

+2

-1 LOWER_BOUND जरूरी तत्व नहीं लौटेगा equal_range। यदि तत्व गुम है तो यह तत्व को वापस कर देगा इससे पहले कि यह वेक्टर में होगा। – T33C

+1

निचले_बाउंड का उपयोग करना अभी भी बुद्धिमान है। इटरेटर ले लो, जांचें कि क्या यह अव्यवस्थित है। यदि ऐसा है, तो इसे हटा दें और खोजे गए तत्व से जांचें। यदि यह तत्व है, तो आपके पास यह है, अन्यथा यह वहां नहीं है। –

संबंधित मुद्दे