2011-06-05 6 views
5

मेरे पास एक नक्शा है जो वैश्विक स्मृति में परिभाषित किया गया है। मैं इसके ऊपर पुनरावृत्ति कर रहा हूं, मान लीजिए कि मैं तीसरे तत्व में हूं। अब मैं एक और फ़ंक्शन कॉल कर रहा हूं जो एक ही मानचित्र पर अपना खुद का इटरेटर उत्पन्न करता है, हालांकि यह मानचित्र में 4 वें या 5 वें तत्वों को मिटा सकता है। मेरा सवाल यह है कि, जब मैं उस फ़ंक्शन से वापस आ जाता हूं और मानचित्र पर फिर से जारी रहता हूं (मैं आपको याद दिलाता हूं कि मैं तीसरे तत्व में हूं), क्या मेरा इटरेटर अमान्य हो सकता है या यह सुरक्षित है?एक मानचित्र पर फिर से शुरू करें और अन्य तत्वों को हटाए गए फ़ंक्शन को कॉल करना मानचित्र

क्षमा करें मैं कोड बहुत संलग्न नहीं कर सकता हूं।

धन्यवाद

संपादित करें: मेरे सवाल कुछ इस तरह है: इस मामले में मैं एक ही तत्व मिटा में

map<string,string> mapi; 

void er() { 
    mapi.erase("t"); 
} 

int main() { 


mapi.insert(pair<string,string>("w","a")); 
mapi.insert(pair<string,string>("e","a")); 
mapi.insert(pair<string,string>("r","a")); 
mapi.insert(pair<string,string>("t","a")); 
mapi.insert(pair<string,string>("A","a")); 
mapi.insert(pair<string,string>("u","a")); 
mapi.insert(pair<string,string>("C","a")); 

map<string,string>::iterator it; 
for (it=mapi.begin(); it!=mapi.end(); it++) { 
    cout << it->first << endl; 
    if (it->first=="t") 
     er(); 
} 

}

- valgrind इसकी एक त्रुटि कहते हैं। हालांकि जब मैं अन्य तत्वों को हटा देता हूं तो यह ठीक काम करता प्रतीत होता है।

+0

एक साधारण उपयोग-केस बनाएं और इसका परीक्षण करें। – Xeo

+0

@Xeo: यह * गारंटी * नहीं होगा कि यह सुरक्षित और परिभाषित है। –

+0

मैंने कुछ बहुत आसान बनाया। ऐसा लगता है कि मैं सिर्फ दूसरों की राय चाहता हूं कि यह सुनिश्चित हो सके कि –

उत्तर

7
http://www.sgi.com/tech/stl/Map.html से

:

नक्शे से एक तत्व मिटाया जा रहा है भी को छोड़कर, ज़ाहिर है, iterators कि वास्तव में तत्व यह है कि है मिटाया जा रहा को इंगित करने के लिए किसी भी iterators को अमान्य नहीं है, ।

+0

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

+2

मिटाएं() शून्य है। कोई इटरेटर वापस नहीं किया गया है –

+0

@rob आप सही हैं; मैं अनुक्रम आवश्यकताओं के बारे में सोच रहा था। मानचित्र के लिए 'm.erase (i ++) 'चाल चल सकता है (पोस्ट-वृद्धि के लिए कुछ अच्छे उपयोगों में से एक)। –

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