2010-12-09 16 views
9

में मान ढूँढना मैं बूस्ट unordered_map का उपयोग कर रहा हूँ। मेरे पास प्रत्येक प्रविष्टि के लिए एक महत्वपूर्ण मूल्य जोड़ी है। मैं कैसे निर्धारित कर सकता हूं कि मानचित्र में कोई विशेष मूल्य मौजूद है या नहीं? (मैं एक और unordered_map बनाना नहीं चाहता जो मूल्य को कुंजी और कुंजी के रूप में संग्रहीत करता है)unordered_map

धन्यवाद।

उत्तर

5

आपको unordered_map में सभी तत्वों पर पुन: प्रयास करने की आवश्यकता है और देखें कि दिया गया मान मौजूद है या नहीं।

std::find_if एक कस्टम भविष्यवाणी के साथ एल्गोरिदम का उपयोग इसे सरल बनाने के लिए किया जा सकता है।

+1

कस्टम भविष्यवाणी? आपको जो कुछ भी चाहिए वह पहले से ही एसटीएल में है। 'compose1 (bind2nd (equal_to (), मान), select2nd <जोड़ी >()) ' – ephemient

+9

@ephemient: यह न तो सरल और न ही पठनीय है। (साथ ही, 'select2nd', एसटीएल का हिस्सा, सी ++ मानक लाइब्रेरी का हिस्सा नहीं है) –

+6

@ephemient: यह कभी भी देखा गया एसटीएल का सबसे खराब उपयोग है। –

7

बूस्ट में Bimap है, जो एक द्विपक्षीय मानचित्र है (यानी, कुंजी और मान दोनों एक दूसरे को संदर्भित करते हैं)। unordered_map की तुलना में यह आपकी आवश्यकताओं के लिए अधिक उपयुक्त लगता है।

+0

क्या ओपी नहीं कहता कि वे एक रिवर्स मैप नहीं चाहते हैं? हालांकि वे औचित्य क्यों नहीं देते हैं। – ephemient

+3

छोटे बच्चे दंत चिकित्सक के लिए एक यात्रा नहीं चाहते हैं, लेकिन वैसे भी अच्छा parenting यह वैसे भी करता है। – chrisaycock

+1

@ephemient: मुझे लगता है कि ओपी एक अलग डेटा संरचना (अधिक संभावना) बनाए रखना नहीं चाहता है। इसलिए यदि यह सभी संकुलित आता है, तो मैं नहीं देख सकता कि एक मुद्दा क्यों होगा (चूंकि समानता को 'मान' के लिए परिभाषित किया गया है)। –

9

कैसे निम्नलिखित के बारे में:

typedef std::unordered_map<int,std::string> map_type; 
typedef std::unordered_map<int,std::string>::value_type map_value_type; 

map_type m; 

if (m.end() != find_if(m.begin(),m.end(),[](const map_value_type& vt) 
              { return vt.second == "abc"; } 
              )) 
    std::cout << "Value found." << std::end; 
else 
    std::cout << "Value NOT found." << std::end; 

या एक बाहरी चर कि कब्जा कर लिया है का उपयोग करते हुए:

std::string value = "abc"; 
if (m.end() != find_if(m.begin(),m.end(),[&value](const map_value_type& vt) 
               { return vt.second == value; })) 
    std::cout << "Value found." << std::end; 
else 
    std::cout << "Value NOT found." << std::end; 
+0

आपके उत्तर के लिए धन्यवाद। लैम्ब्डा अभिव्यक्ति के लिए, मैं वापसी कैसे कर सकता हूं अगर वापसी vt.second == "abc" जिसमें "abc" एक तर्क है जिसे पारित करने की आवश्यकता है? – Ashley

+8

मैंने ऊपर दिए गए उदाहरण को अपडेट किया है। संक्षेप में आप उस चर से वैरिएबल को कैप्चर करते हैं जिसमें लैम्ब्डा परिभाषित किया गया है। –

+0

अच्छा उत्तर, सी ++ 0x (या सी ++ 03 के लिए एक्सटेंशन) की आवश्यकता है हालांकि। –

-3

क्यों हम पाते हैं के बजाय गणना विधि उपयोग नहीं कर सकते()

विवरण : किसी विशिष्ट कुंजी के साथ तत्वों की गणना करें तत्वों के लिए कंटेनर खोजें जिनकी कुंजी है और पाए गए तत्वों की संख्या लौटाती है। चूंकि unordered_map कंटेनर डुप्लिकेट कुंजी की अनुमति नहीं देते हैं, इसका मतलब यह है कि फ़ंक्शन वास्तव में 1 लौटाता है यदि उस कुंजी वाला तत्व कंटेनर में मौजूद है, और अन्यथा शून्य है।

unordered_map<int, int> hash; 
    //converted array into hashMap 
    for(int i=0; i<6; i++) 
    { 
     hash[i]; 
    } 

    //commom elemenest value is set to 1 in hashMap 
    for(int i =0; i<7; i++) 
    { 
     //element exist in array1 
     if(hash.count(i)) 
     { 
      hash[i] = 1; 
     } 
    } 
+1

प्रश्न का उत्तर नहीं देता - ओपी एक मूल्य की तलाश करना चाहता है, एक कुंजी नहीं। – Jarrett

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