2014-04-28 4 views
12

मान लें कि मेरे पास std::map<int, int> है, क्या यह सुरक्षित होगा?[= ऑपरेटर का उपयोग करके एक नया std :: मैप एंट्री बनाने के लिए सुरक्षित है []?

std::map<int, int> m_map; 
m_map[0] += 1; 

तो कुंजी 0 नक्शा मैं यह कर जब में मौजूद नहीं था, यह कैसे क्या मूल्य के लिए 1 जोड़ने के लिए पता होगा?

मुझे उम्मीद है कि std :: नक्शा के बजाय पर पर ऐसा करता है, जहां मूल्य मानचित्र में एक नई प्रविष्टि बनाता है। यह करने के लिए होने से मुझे छोड़ जाएगा:। (सभी पूर्णांक के लिए शून्य)

std::map<int, int>::iterator it = m_map.find(0); 
if(it != m_map.end()) { 
    it->second += 1; 
} 
else { 
    m_map[0] = 1; 
} 
+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/4523959/stdmap-default-value-for-build-in-type – JBentley

उत्तर

18

एक तत्व operator[] के आह्वान पर एक नक्शे में डाला किसी पूर्व-तुच्छ कुंजी के कारण मूल्य प्रारंभ है। यदि आपने उस वाक्यविन्यास को नहीं देखा है, तो () विशेष कोड स्निपेट में विशेष अर्थ पर विचार करें।माता-पिता महत्वपूर्ण हैं। वे डिफ़ॉल्ट-प्रारंभिक की तुलना में प्रारंभिक पेड़ के नीचे एक अलग यात्रा पेश करते हैं। दोनों महत्वपूर्ण हैं; दोनों भाषा मानक द्वारा निर्धारित कर रहे हैं।

int i = int(); 

यह पता चला है के रूप में, scalars (संकेत सहित) के लिए मूल्य प्रारंभ अंततः शून्य प्रारंभ को succumbs। हालांकि अजीब लग रही है, पूर्व स्निपेट मान int का एक उदाहरण शुरू करता है, जो शून्य-प्रारंभिक बन जाता है क्योंकि int स्केलर है, फिर इसे i पर कॉपी करता है। (निष्पक्ष होने के लिए, लगभग निश्चित रूप से कुछ eliding होगा, लेकिन बुनियादी बातों को प्रस्तुत किया जाता है)।

परवाह किए बिना, कि सुविधा की वजह से, तो आश्वस्त रहें कि जब आप यह करते हैं:

m_map[0] += 1; 

या यहाँ तक कि इस:

++m_map[0]; 

सूचकांक पहले मैप नहीं किया गया था, एक value- प्रारंभिक तत्व जोड़ा जाता है, जो स्केलर्स के लिए शून्य-प्रारंभिक होगा, जिसका अर्थ है कि आप आधिकारिक तौर पर शून्य से शुरू करेंगे।

यह उल्लेखनीय है कि एक समान गतिविधि किसी भी प्रकार के लिए एक निश्चित रूप से घोषित कन्स्ट्रक्टर के साथ होती है। चाहे तुच्छ हो या नहीं, कुछ दिलचस्प होता है।

struct S { int a; int b; }; 
std::map<int, S> mymap; 

++mymap[0].a; 

a सदस्य हमारे कंटेनर मज़बूती से ऊपर कार्यान्वित के बाद 1 में 0 को मैप किया है? हां, यह है। इसके अलावा, इस पर विचार करें:

struct S { int a; std::string str; }; 
std::map<int, S> mymap; 

++mymap[0].a; 

अब S एक गैर तुच्छ अंतर्निहित निर्माता (यह करने के लिए है के रूप में यह str का निर्माण करना होगा) है। लेकिन a सदस्य 0 पर हमारे कंटेनर में अभी भी विश्वसनीय रूप से शून्य-प्रारंभिक (और इसलिए 1 उपरोक्त पंक्ति के बाद) मैप किया गया है? हां, यह है।

प्रारंभिकरण के संदर्भित विभिन्न पथों के बारे में उत्सुक, see this question and answer। या सी ++ 11 मानक की समीक्षा करें, विशेष रूप से सी ++ 11 § 8.5 प्रारंभकर्ता, (पी 5, पी 7, पी 10)। यह पढ़ने लायक है।

2

मानचित्र lazily डिफ़ॉल्ट निर्माता के साथ प्रारंभ कर रहा है

तो यह 0 मानचित्र में मौजूद नहीं था, यह नियंत्रित करने के लिए प्रारंभ की जाएगी += 1 के बाद मान 0 और 1 जोड़ा जाएगा।

तो आप बिना किसी चिंता के कोड के ऊपरी संस्करण का उपयोग कर सकते हैं।

की बुला map_obj [k] प्रभाव का हवाला देते हुएcplusplus.com से

कश्मीर कंटेनर में एक तत्व की कुंजी, समारोह अपने मैप किया मूल्य के लिए एक संदर्भ रिटर्न से मेल खाता है।

कश्मीर कंटेनर में किसी भी तत्व के प्रमुख से मेल नहीं खाता, समारोह है कि कुंजी के साथ एक नए तत्व सम्मिलित करता है और अपने मैप किया मूल्य के लिए एक संदर्भ देता है, तो। ध्यान दें कि यह हमेशा कंटेनर आकार को एक से बढ़ाता है, भले ही कोई मैप किए गए मान तत्व को असाइन नहीं किया गया हो ( तत्व अपने डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करके बनाया गया है)।

4

हाँ यह ठीक, नई प्रविष्टियां डिफ़ॉल्ट value_type() जो int के लिए 0 है मूल्य है।

यह अभी भी += करता है, लेकिन 0 += 11 देता है।

7

यह गारंटी है कि आपको छोटे स्निपेट के साथ भी 1 मिल जाएगा।

कुंजी, operator[] नक्शा में तत्व बार जब आप += तत्व पहले से मौजूद है करने के लिए मिल गया है इसे करने के लिए एक संदर्भ के लौटने, तो से पहले बनाने के लिए किया है, और, अगर यह अब बनाया जा सकता था साथ मान शून्य (चूंकि मानचित्र के तत्व मूल्य-प्रारंभिक होते हैं)।

(संयोग से, इस कारण है कि, जब आप मूल्य के रूप में एक वर्ग के प्रकार के साथ एक std::map उपयोग करते हैं, यह एक डिफ़ॉल्ट निर्माता के लिए आप operator[] उपयोग करना चाहते हैं नहीं है, भले ही आप तुरंत इसे करने के लिए एक वस्तु आवंटित)

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