c++ - Does std::map::erase(it++) maintain a valid iterator pointing to the next element in the map? -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 5 जवाब
मैं के साथ Xcode का उपयोग कर रहा हूँ एक std :: नक्शा के लिए सी ++ 11 मेरे नक्शे के कुछ तत्वों में एक झंडा है जो कहता है कि उन्हें निकाला जाना चाहिए।
मैं ओ (एन) समय में ध्वजांकित तत्वों को मिटाने के लिए मानचित्र के माध्यम से फिर से करना चाहता हूं। मिटाने के लिए कॉल एक इटरेटर वापस नहीं करता है। मैंने कुछ प्रकार के मिटा (यह ++) कार्यान्वयन देखा है, लेकिन मेरे पास कोई सबूत नहीं है कि इस तरह की कॉल काम कर सकती है क्योंकि इटरेटर मिटाए जाने के ऑपरेशन के बाद अमान्य हो जाएगा लेकिन वेतन वृद्धि के पहले।
मेरा वर्तमान कोड तो अक्षम।
<पूर्व> के लिए (स्वतः = myMap.begin); it! = MyMap.end (); ++ यह) {हटाएं} myMap.erase (यह); यह = myMap.begin (); // मैं फिर से नक्शे के माध्यम से दोबारा कैसे से बच सकता हूँ}
ऑनलाइन प्रलेखन से:
"कार्यवाहक, पॉइंटर्स और फ़ंक्शन द्वारा हटाए गए तत्वों की ओर संदर्भ संदर्भ अवैध हैं। अन्य सभी इटरेटर, पॉइंटर्स और संदर्भ उनकी वैधता रखते हैं।"
तो शायद यह:
<प्री> के लिए (स्वतः = myMap.begin); it! = MyMap.end ();) {auto itPrev = it; यह ++; अगर (इसे हटाए गए (* यह प्रिव्यू)) myMap.erase (itPrev); }
संपादित करें: मिटा (यह ++)
विचार जो आप का उल्लेख करते हैं वास्तव में ठीक है, क्योंकि वेतन वृद्धि होती है (और पुरानी, पूर्व-वेतनमान मान की एक प्रति देता है ) इससे पहले कि मिटाएं ()
कहा जाता है यह प्रभाव के बराबर है:
टेम्पलेट & lt; typename IteratorT & gt; इटरेटर टी पोस्टइनक्रिट (इटरेटर टी एंड ए) {ऑटो प्रति = यह; यह ++; वापसी प्रति; } के लिए (स्वतः इसे = myMap.begin (); it! = MyMap.end ();) myMap.erase (PostIncrement (यह));
जो अन्य उदाहरण के समान एक ही चीज़ के बराबर है संयोग से, यही कारण है कि आपको सामान्यतः उपन्यासों के साथ उपसर्ग ++ का उपयोग करना चाहिए; प्रतिलिपि ऑपरेशन अतिरिक्त ओवरहेड है, और आपको आमतौर पर इसकी आवश्यकता नहीं है।
Comments
Post a Comment