2008-12-15 5 views
6

मैं एक नोड structएसडीडी लाइब्रेरी में कौन सा फ़ंक्शन बाइनरी खोजना है और एक तत्व ढूंढना है?

struct Node{CString text, int id;}; 

एक क्रमबद्ध वेक्टर में मिल गया है।

मुझे आश्चर्य है कि क्या एल्गोरिदम में कोई फ़ंक्शन है जो वेक्टर की बाइनरी खोज करेगा और एक तत्व ढूंढ पाएगा।

+1

क्या आप सीएसटींग के बीच कॉमा के बारे में निश्चित हैं? क्या वह अर्धविराम नहीं होना चाहिए? – razeh

उत्तर

20

std::binary_search() आपको पता चलेगा कि एक मूल्य के कंटेनर में मौजूद है लिख सकते हैं।

std::lower_bound()/std::upper_bound() एक मूल्य के प्रथम/अंतिम घटना के लिए एक इटरेटर वापस आ जाएगी।

आपका वस्तुओं 01 लागू करने की आवश्यकता काम करने के लिए इन एल्गोरिदम के लिए।

+4

या आपको 'binary_search' के लिए अन्य अधिभार का उपयोग करने और चौथे पैरामीटर पर एक तुलनित्र प्रदान करने की आवश्यकता है। यह वही तुलनित्र होना चाहिए जिसका उपयोग आप सॉर्ट करने के लिए करते थे। – KitsuneYMG

+0

"निचले_बाउंड के विपरीत, ऊपरी_बाउंड के लिए इस फ़ंक्शन द्वारा लौटाए गए इटरेटर द्वारा इंगित मूल्य ** समतुल्य ** समतुल्य ** नहीं हो सकता है, केवल अधिक।"ऊपरी_बाउंड वैल के आखिरी मौके को कैसे लौटा सकता है ?? –

6

हाँ, वहाँ एक समारोह "binary_search" std :: binary_search

आप इसे पहले देना कहा जाता है, पिछले और एक मूल्य या एक विधेय है।

एक नमूने के लिए here देखें

कम्बाइन कि Martin York's ऑपरेटर के साथ == और आप ठीक होना चाहिए (वैकल्पिक रूप से आप एक विधेय functor

+0

वास्तव में बाइनरी खोज के लिए, आपको ऑपरेटर की आवश्यकता है <, ऑपरेटर == –

+0

बूस्ट :: बाइंड (और नोड :: टेक्स्ट, _1) <कुंजी :) –

+1

यह भी ध्यान दें कि यह तत्व नहीं मिला है। यह केवल अस्तित्व के लिए परीक्षण है। –

0

सॉर्ट किए गए वेक्टर < नोड >
मानचित्र का उपयोग क्यों न करें। यह एक क्रमबद्ध कंटेनर है। तो std :: find() के माध्यम से इस पर किए गए किसी भी खोज में स्वचालित रूप से बाइनरी खोज के समान गुण होते हैं।

+0

यदि आपका डेटा स्थिर है (कोई चल रहा अतिरिक्त/हटाना नहीं है), यह वेक्टर का उपयोग करने के लिए अधिक मेमोरी कुशल है। अगर आपको सिस्टम के अन्य हिस्सों के साथ बातचीत करने की आवश्यकता है जो उम्मीद करते हैं वेक्टर। या आपको इंडेक्स द्वारा डेटा तक पहुंचने की ज़रूरत है। या डेटा को एक तंग लूप में एक्सेस किया जाता है, जहां मेमोरी इलाका महत्वपूर्ण है। – KeithB

+0

"एक सॉर्टेड वेक्टर आपको क्रम में सामग्री के माध्यम से फिर से चालू करने देता है।": तो नक्शा करता है। (के लिए (std :: map :: iterator i = map.begin(); i! = map.end(); ++ i) ...) –

+1

एक मानचित्र भी कई उदाहरणों के साथ आसानी से सौदा नहीं करता है कुंजी। – baash05

0

सॉर्ट किए गए वेक्टर में तत्वों की एक श्रृंखला खोजने के लिए std::equal_range का उपयोग करें। std::equal_range इटरेटर के std::pair लौटाता है, जो आपको प्रदान किए गए तर्क के बराबर तत्वों के वेक्टर में एक रेंज देता है। यदि सीमा खाली है, तो आपका आइटम वेक्टर में नहीं है, और सीमा की लंबाई आपको बताती है कि वेक्टर में आपका आइटम कितनी बार दिखाई देता है।

यहाँ struct Node के बजाय ints का उपयोग कर एक उदाहरण है:

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <string> 

int main(int argc, const char * argv[]) 
{ 
    std::vector<int> sorted = { 1, 2, 2, 5, 10 }; 

    auto range = std::equal_range(sorted.begin(), sorted.end(), 20); 
    // Outputs "5 5" 
    std::cout << std::distance(sorted.begin(), range.first) << ' ' 
       << std::distance(sorted.begin(), range.second) << '\n'; 

    range = std::equal_range(sorted.begin(), sorted.end(), 5); 
    // Outputs "3 4" 
    std::cout << std::distance(sorted.begin(), range.first) << ' ' 
       << std::distance(sorted.begin(), range.second) << '\n'; 

    range = std::equal_range(sorted.begin(), sorted.end(), -1); 
    // Outputs "0 0" 
    std::cout << std::distance(sorted.begin(), range.first) << ' ' 
       << std::distance(sorted.begin(), range.second) << '\n'; 

    return 0; 
} 

struct Node के साथ इस काम करने के लिए आप या तो struct Node के लिए एक operator < प्रदान करने या std::equal_range करने के लिए एक तुलनित्र में पारित करने के लिए होगा। आप अपने structs की तुलना करने के लिए std::equal_range पर एक लैम्बडा प्रदान करके ऐसा कर सकते हैं।

std::vector<Node> nodes = { Node{"hello", 5}, Node{"goodbye", 6} }; 
Node searchForMe { "goodbye", 6 }; 
auto range = std::equal_range(nodes.begin(), nodes.end(), searchForMe, 
           [](Node lhs, Node rhs) { return lhs.id < rhs.id; }); 
संबंधित मुद्दे