एक तत्व 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)। यह पढ़ने लायक है।
संभावित डुप्लिकेट: http://stackoverflow.com/questions/4523959/stdmap-default-value-for-build-in-type – JBentley