2010-10-10 23 views
11

संभावित डुप्लिकेट पुनरावृत्ति करते हुए:
Vector.erase(Iterator) causes bad memory access
iterate vector, remove certain items as I go.हटाने

हाय, मैं यह लिखा है, लेकिन मैं कुछ त्रुटियाँ प्राप्त कर रहा हूँ, जब उसने चलना

for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) { 
     if (track->empty()) { // if track is empty, remove it 
      tracks_.erase(track); 
      track++; // is this ok? 
     }else { //if there are points, deque 
      track->erase(track->begin()); //my program crashes here after a while... ;(
     } 
    } 

मैं vecto का एक वेक्टर है अंक (2 इंट्स) जिनके मैं ट्रैक ट्रैक करता हूं (1 ट्रैक अंक का 1 वेक्टर है) मैं प्रत्येक ट्रैक को देखना चाहता हूं और यदि उनमें अंक हैं तो पहले को हटाएं अन्यथा ट्रैक हटा दें। क्या ये सही है?

अग्रिम धन्यवाद।

+0

क्या त्रुटियों मिल रहा है? –

+0

इस तरह का सवाल पहले से ही कई बार पूछे जा चुके हैं। "सी ++ मिट इटेटरेटर" की खोज करने का पहला परिणाम http://stackoverflow.com/questions/2943912/vector-eraseiterator-causes-bad-memory-access है जो इस प्रश्न का उत्तर भी देता है। – TheUndeadFish

+0

@ nacho4d: सीधे संबंधित नहीं है, लेकिन दो-आयामी संरचनाओं के लिए बूस्ट मल्टीएरे पर एक नज़र डालें। 'Std :: vector >' प्रकार से अधिक उपयोग करना कुछ आसान है। – lunaryorn

उत्तर

33

एक वेक्टर का erase() मौजूदा इटरेटर्स को अमान्य करता है, लेकिन returns हटाए गए एक के बाद तत्व को इंगित करने वाला एक नया इटरेटर। यह लौटाया गया इटरेटर का उपयोग वेक्टर पर फिर से जारी रखने के लिए किया जा सकता है।

आपका पाश इस तरह लिखा जा सकता है:

vector< vector<Point> >::iterator track = tracks_.begin(); 
while (track != tracks_.end()) { 
    if (track->empty()) { 
     // if track is empty, remove it 
     track = tracks_.erase(track); 
    } 
    else { 
     //if there are points, deque 
     track->erase(track->begin()); 
     ++track; 
    } 
} 
+0

बहुत बढ़िया। मजबूत, सरल, मुझे अपना खुद का प्रतिनिधि बनाने की आवश्यकता नहीं है, आदि – Eliot

+0

यह एक आम पर्याप्त पैटर्न है कि यह कुछ ऐसा दिखाना अच्छा लगेगा जैसे यह std में दिखाई देता है। – jbruni

+0

दूसरा "डेक" मिटाने वाला क्या करता है? इटरेटर "ट्रैक" में एक मिटा/प्रारंभ विधि भी नहीं है? इसे संकलित नहीं कर सकता और बिना काम करता है। – lama12345

2

मुझे यकीन नहीं है कि आपको कौन सी त्रुटियां मिल रही हैं, लेकिन संभावना है कि आप अपने इटरेटर को अमान्य कर रहे हैं।

आप पढ़ना चाहिए http://www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf

विशेष रूप से, vector::erase स्थिति या पहले के बाद तत्वों के लिए सभी इटरेटर और संदर्भ अमान्य हो जाएगा।

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