2009-03-26 12 views
14

संकलित करने में विफल रहता है क्या एसटीएल मानचित्र के संदर्भ में गुजरने का कोई कारण है क्योंकि [] ऑपरेटर टूटने का कारण बनता है?सी ++ कॉन्स std :: नक्शा संदर्भ

error: no match for ‘operator[]’ in ‘map[name]’

यहाँ समारोह प्रोटोटाइप है: जब मैं स्थिरांक का उपयोग मैं इस संकलक त्रुटि (जीसीसी 4.2) मिलता है,

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map); 

और मुझे कोई समस्या नहीं है कि वहाँ जब मैं स्थिरांक हटाने का उल्लेख करना चाहिएstd :: के नक्शे में कीवर्ड

यदि मुझे सही तरीके से निर्देश दिया गया है, तो [] ऑपरेटर वास्तव में मानचित्र में एक नई जोड़ी डालेगा यदि उसे कुंजी नहीं मिलती है, जो निश्चित रूप से समझाएगा कि ऐसा क्यों होता है, लेकिन मैं कल्पना नहीं कर सकता यह कभी स्वीकार्य व्यवहार होगा।

यदि कोई बेहतर तरीका है, तो का उपयोग करने के बजाय [] की बजाय, मैं इसकी सराहना करता हूं। मुझे लगता है कि मुझे काम करने के लिए मिलना प्रतीत नहीं होता है ... मुझे कॉन्स मिस्मिटेड इटरेटर त्रुटियां मिलती हैं।

धन्यवाद।

उत्तर

26

हाँ आप operator[] का उपयोग नहीं कर सकते हैं। find का उपयोग करें, लेकिन यह रिटर्न const_iterator बजाय iterator ध्यान दें:

std::map<std::string, std::string>::const_iterator it; 
it = map.find(name); 
if(it != map.end()) { 
    std::string const& data = it->second; 
    // ... 
} 

यह संकेत के साथ की तरह है। आप int const*int* असाइन नहीं कर सकते हैं। इसी प्रकार, आप const_iterator से iterator असाइन नहीं कर सकते हैं।

6

जब आप ऑपरेटर [] का उपयोग कर रहे हैं, std :: map दिए गए कुंजी के साथ आइटम ढूंढता है। अगर इसे कोई नहीं मिलता है, तो यह इसे बनाता है। इसलिए कॉन्स के साथ समस्या।

ढूंढने का तरीका उपयोग करें और आप ठीक होंगे।

क्या आप कोड() का उपयोग करने की कोशिश कर रहे हैं इस पर कोड पोस्ट कर सकते हैं? सही तरीके से होगा: कोई स्थिरांक ऑपरेटर [] std :: नक्शे में नहीं है

if(map.find(name) != map.end()) 
{ 
    //... 
} 
2

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

2

अपने "स्थिरांक बेमेल इटरेटर त्रुटि" के लिए:

खोज() दो भार के होते हैं:

 iterator find (const key_type& x); 
const_iterator find (const key_type& x) const; 

मेरे अनुमान कि आपको यह त्रुटि क्योंकि आप की तरह कुछ कर रहे हो रही है है एक const नक्शे पर एक गैर स्थिरांक एक find() कॉल के परिणाम के इटरेटर (बाईं ओर) बताए:

iterator<...> myIter /* non-const */ = myConstMap.find(...) 

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

3

यदि आप सी ++ 11, std::map::at का उपयोग कर रहे हैं तो आपके लिए काम करना चाहिए।

कारण std::map::operator[] काम नहीं करता है कि कुंजी की स्थिति में आप मानचित्र में मौजूद नहीं हैं, यह प्रदान की गई कुंजी का उपयोग करके एक नया तत्व डालेगा और इसके संदर्भ को वापस कर देगा (लिंक देखें ब्योरा हेतु)। यह एक const std :: मानचित्र पर संभव नहीं है।

'एट' विधि, हालांकि, कुंजी मौजूद नहीं है, तो अपवाद फेंक देगा। ऐसा कहा जा रहा है कि, 'at' विधि का उपयोग कर तत्व तक पहुंचने का प्रयास करने से पहले std :: map :: find विधि का उपयोग करके कुंजी के अस्तित्व की जांच करना शायद एक अच्छा विचार है।