2012-05-14 10 views
6

मैं उलझन में हूं जो अधिक कुशल है?एसटीएल एमएपी मानचित्र में तत्व खोजने के लिए खोज() या [एन] पहचानकर्ता का उपयोग करना चाहिए?

जैसा कि हम सीधे मानचित्र तक पहुंच सकते हैं, हमें खोजने का उपयोग करने की आवश्यकता क्यों है?

मुझे सिर्फ यह जानने की जरूरत है कि कौन सा तरीका अधिक कुशल है।

#include <iostream> 
#include <map> 
using namespace std; 

int main() 
{ 
    map<char,int> mymap; 
    map<char,int>::iterator it; 

    mymap['a']=50; 
    mymap['b']=100; 
    mymap['c']=150; 
    mymap['d']=200; 

    //one way 

    it=mymap.find('b'); 
    cout << (*it).second <<endl; 

    //another way 
     cout << mymap['b'] <<endl; 

    return 0; 
} 

अग्रिम धन्यवाद! :)

उत्तर

18

का उपयोग find मतलब है कि आप अनजाने नक्शे में एक नए तत्व बनाने यदि कुंजी मौजूद नहीं है नहीं है, और - अधिक महत्वपूर्ण बात - इसका मतलब है कि आप find उपयोग कर सकते हैं एक को देखने के लिए तत्व यदि आपके पास है तो स्थिर मानचित्र के संदर्भ में है।

इसका मतलब है कि आपको find के वापसी मूल्य की जांच करनी चाहिए। आम तौर पर यह इस प्रकार है:

void somewhere(const std::map<K, T> & mymap, K const & key) 
{ 
    auto it = mymap.find(key); 
    if (it == mymap.end()) { /* not found! */ } 
    else     { do_something_with(it->second); } 
} 
+2

+1 यह बिल्कुल महत्वपूर्ण है जब आप तत्व नहीं बनाना चाहते हैं यदि यह नहीं मिला है। –

2

हम सीधे मानचित्र का उपयोग कर सकते हैं, यही कारण है कि हम पाते हैं उपयोग करने के लिए की जरूरत है?

क्योंकि map<>::operator[] कभी-कभी गंदा होता है। एक तत्व तो मौजूद नहीं है:

  • यह
  • मूल्य यह मूल्य

इस प्रकार यह हमेशा मूल्य का एक मान्य संदर्भ रिटर्न की

  • रिटर्न संदर्भ प्रारंभ सम्मिलित करता है, यहां तक ​​कि एक अगर कुंजी पहले मौजूद नहीं है। यह व्यवहार कई बार इरादा नहीं है।

    दूसरी तरफ map<>::find() सुरक्षित है; क्योंकि यह मान end() देता है, यदि कोई मान बाहर नहीं निकलता है। find() का एक अन्य लाभ यह है कि यह एक पुनरावर्तक देता है जिसमें कुंजी (first) और मान (second) दोनों के संदर्भ शामिल हैं।

  • +0

    'ऑपरेटर []' मान का संदर्भ देता है, कुंजी नहीं। – jpalecek

    +0

    @jpalecek, yup यह swapped हो गया। Thx – iammilind

    +0

    * 'map <> :: ढूंढें()' सुरक्षित है *। खैर, वास्तव में नहीं।सबसे सरल उदाहरण प्रश्न में कोड है, जहां उपयोगकर्ता यह सत्यापित नहीं कर रहा है कि इटरेटर मान्य है या नहीं। उस विशेष मामले में 'नक्शा <> :: ऑपरेटर [] '* सुरक्षित * है क्योंकि यह गारंटी देता है कि कार्यक्रम में अपरिभाषित व्यवहार नहीं है। –

    1

    मानचित्र में [] ऑपरेटर स्थिर नहीं है यह लॉगरिदमिक है। अधिकांश किताबें इस तथ्य पर जोर देती हैं और बताती हैं कि यह थोड़ा भ्रामक है। तो दोनों खोज और [] ऑपरेटर एक ही जटिलता के साथ हैं।

    कृपया ध्यान दें कि [] ऑपरेटर प्रवेश करेगा, भले ही यह अस्तित्व में न हो, जबकि उस स्थिति में अंत() वापस आ जाएगा।

    0

    इस कोड और डॉक से cplusplus.com

    // accessing mapped values 
    #include <iostream> 
    #include <map> 
    #include <string> 
    using namespace std; 
    
    int main() 
    { 
        map<char,string> mymap; 
    
        mymap['a']="an element"; 
        mymap['b']="another element"; 
        mymap['c']=mymap['b']; 
    
        cout << "mymap['a'] is " << mymap['a'] << endl; 
        cout << "mymap['b'] is " << mymap['b'] << endl; 
        cout << "mymap['c'] is " << mymap['c'] << endl; 
        cout << "mymap['d'] is " << mymap['d'] << endl; 
    
        cout << "mymap now contains " << (int) mymap.size() << " elements." << endl; 
    
        return 0; 
    } 
    
    OP: 
    mymap['a'] is an element 
    mymap['b'] is another element 
    mymap['c'] is another element 
    mymap['d'] is 
    mymap now contains 4 elements. 
    

    सूचना कैसे पिछले एक्सेस (तत्व 'प' के लिए) है कि कुंजी के साथ नक्शे में एक नए तत्व सम्मिलित करता उठाया और उसके डिफ़ॉल्ट मान आरंभ नहीं हो जाता (एक खाली स्ट्रिंग) भले ही इसे केवल अपने मूल्य को पुनः प्राप्त करने के लिए उपयोग किया जा सके। सदस्य समारोह मानचित्र :: खोज इस प्रभाव का उत्पादन नहीं करता है।

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