2009-02-03 12 views
43

मैं एक std::map इस तरह है:क्या एसटीएल मानचित्र डालने पर आदिम प्रकार शुरू करते हैं?

map<wstring,int> Scores; 

यह खिलाड़ियों और स्कोर के नाम संग्रहीत करता है। जब कोई व्यक्ति एक स्कोर हो जाता है मैं बस करना होगा:

Scores[wstrPlayerName]++; 

जब कुंजी wstrPlayerName साथ नक्शे में कोई तत्व यह बना दिया जाएगा वहाँ है, लेकिन यह वेतन वृद्धि से पहले शून्य या शून्य करने के लिए प्रारंभ करता है या यह अपरिभाषित छोड़ दिया है ?

क्या मुझे परीक्षण करना चाहिए यदि तत्व वृद्धि से पहले हर बार मौजूद है?

उत्तर

61

ऑपरेटर [] इस तरह दिखता है:

Value& map<Key, Value>::operator[](const Key& key); 

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

map<wstring,int> Scores; 
Scores[wstrPlayerName]++; 

मूल्य यहाँ पूर्णांक है, और ints, डिफ़ॉल्ट-निर्माण 0 के रूप में कर रहे हैं के रूप में यदि आप उन्हें पूर्णांक() साथ प्रारंभ। अन्य आदिम प्रकार इसी तरह प्रारंभ किया है (जैसे, डबल(), लंबे(), bool(), आदि)।

अंत में, आपका कोड मानचित्र में एक नई जोड़ी (wstrPlayerName, 0) डालता है, फिर int के संदर्भ में आता है, जिसे आप तब बढ़ाते हैं। इसलिए, परीक्षण करने की कोई आवश्यकता नहीं है कि क्या तत्व मौजूद है यदि आप 0 से शुरू करना चाहते हैं।

11

यह डिफ़ॉल्ट रूप से value का एक नया उदाहरण तैयार करेगा। पूर्णांक के लिए, डिफ़ॉल्ट निर्माण 0 है, इसलिए यह इरादे के रूप में कार्य करता है।

+1

पूर्णांक के लिए, डिफ़ॉल्ट * निर्माण * वास्तव में एक चीज़ नहीं है। डिफ़ॉल्ट * प्रारंभिक * उन्हें स्थिर नहीं करता जब तक कि वे स्थैतिक न हों। मानचित्र * मान * - तत्वों को आरंभ करें, यही कारण है कि पूर्णांक के मामले में आपको शून्य-प्रारंभिकरण मिलता है। – juanchopanza

5

आपको यह जांचना नहीं चाहिए कि आइटम बढ़ने से पहले मौजूद है या नहीं। [] ऑपरेटर ठीक वही करता है जो आपको करने की ज़रूरत है, जैसा कि अन्य ने कहा है।

लेकिन यदि डिफ़ॉल्ट-निर्मित मूल्य आपके लिए काम नहीं करेगा तो क्या होगा? आपके मामले में यह पता लगाने का सबसे अच्छा तरीका है कि तत्व पहले से मौजूद है या नहीं, इसे सम्मिलित करने का प्रयास करना है। insertstd::map के लिए सदस्य फ़ंक्शन std::pair<iterator, bool> देता है। चाहे सम्मिलन सफल हो या विफल हो जाए, जोड़ी का पहला तत्व वांछित वस्तु को इंगित करेगा (या तो आपका नया, या वह जो पहले से मौजूद था)। जब आप फिट देखते हैं तो आप इसके मूल्य को बदल सकते हैं।

4

सहायता के लिए धन्यवाद।

तो std :: नक्शे 0.

करने के लिए अपने आदिम प्रकार मूल्यों को निर्धारित मैं सिर्फ इसलिए कि मैंने सोचा था कि आदिम प्रकार बातें जब बनाया हमेशा अपरिभाषित हैं सोचा।

अगर मैं की तरह कुछ लिखें:

int i; 
i++; 

संकलक मुझे चेतावनी दी है कि मैं अपरिभाषित है और जब मैं कार्यक्रम चलाने यह आम तौर पर शून्य नहीं है।

+7

यह वास्तव में सी ++ भाषा की एक विशेषता है। यदि आप स्पष्ट रूप से int के कन्स्ट्रक्टर (int i = int()) को कॉल करते हैं जैसे std :: map करता है तो इसे शून्य पर प्रारंभ किया जाएगा। एक नंगे int मैं अभी भी अनियमित हो जाएगा। –

+2

वास्तव में, क्योंकि "int i;" डिफ़ॉल्ट रूप से int (कक्षा प्रकारों के विपरीत) को प्रारंभ नहीं करेगा। यह अपना मूल्य अपरिभाषित छोड़ देगा। वही: एक {int i; }; << मेरा मान अपरिभाषित है। एक {ए(): i() {} int i; }; << मेरा मान 0 –

+0

हैग ऑन करें। यदि आपके पास संरचना ए है {int i; }; और फिर आप टाइप ए का एक ऑब्जेक्ट बनाते हैं, उदा। एक myA = ए(); तो myA.i 0 होगा क्योंकि ए() को कॉल करने/उपयोग करने से पूरे myA को 0 तक शुरू किया जाएगा, इसलिए यह 0 होगा। http://en.cppreference.com/w/cpp/language/zero_initialization – Will

1

प्रारंभ करने के लिए नियमों की जांच करें।

अनुभाग 4.9.5 सी ++ प्रोग लैंग या सी ++ एसडीडी बुक शुरू करना देखें। इस पर निर्भर करता है कि आपका चर स्थानीय, स्थैतिक, उपयोगकर्ता परिभाषित या कॉन्स्ट डिफ़ॉल्ट प्रारंभिक हो सकता है या नहीं।

आपके मामले में, int को पीओडी (सादा पुराना डेटाटाइप) कहा जाता है। कोई भी ऑटो (ढेर/स्थानीय चर पर बनाया गया) पीओडी चर डिफ़ॉल्ट रूप से प्रारंभ नहीं है। इसलिए आपके लिए "i" उपरोक्त मूल्य शून्य नहीं होगा।

ढेर में परिभाषित होने पर हमेशा पीओडी शुरू करने की आदत बनाते हैं। आप मूल्य को प्रारंभ करने के लिए int() का भी उपयोग कर सकते हैं।

+3

देखें पीओडी के बारे में आपने जो कहा है वह सही है, लेकिन ओपी std :: map द्वारा किए गए प्रारंभिकरण के बारे में पूछ रहा है। आपका उत्तर लागू नहीं होता है और पाठकों को भ्रमित कर सकता है क्योंकि ऐसा लगता है कि यह अन्य उत्तरों के विपरीत है। – MatthewD

+0

ठीक है, आपका जवाब वास्तव में @ कैल्मरियस के उत्तर का जवाब दे रहा है, जो अब ** ** ** ** ** से ऊपर नहीं है) जैसा कि मैं इसे पढ़ रहा हूं। यह वास्तव में एक टिप्पणी होना चाहिए, एक अलग जवाब नहीं। – MatthewD

+0

पोस्ट किए गए प्रश्न के उत्तर के रूप में, यह पूरी तरह गलत है। – juanchopanza

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