सही कोड है निम्नलिखित:
for (std::list<int>::iterator itr = lst.begin(); itr != lst.end(); /*nothing*/)
{
if (*itr > 10)
itr = lst.erase(itr);
else
++itr;
}
जब आप सूची से कोई आइटम हटाते हैं, तो आप इटरेटर अमान्य हो सकती है इसलिए आप erase
का उपयोग कर हटाने की आवश्यकता (अगर यह कहते हैं करने के लिए आइटम हटाया जा रहा है।) (जो अगले आइटम को इंगित करने वाला एक मान्य इटरेटर देता है)।
और भी बेहतर विचार std::remove_if
का उपयोग करेंगे:
bool greater_than_10(int x)
{
return x > 10;
}
lst.remove_if(greater_than_10);
अपने संकलक lambdas का समर्थन करता है, तो आप इसे रख सकते हैं भी कम:
lst.remove_if([](int x){ return x > 10; });
(मैं इस कोड का परीक्षण नहीं किया है, के रूप में मेरे कंपाइलर इतना नया नहीं है; लैम्ब्डा फ़ंक्शन को जॉन जॉनिंग के उत्तर से धन्यवादपूर्वक चोरी किया जाता है।)
असल में, सूची से मिटाने से only the iterators pointing to the item being deleted अमान्य हो जाता है। सावधान रहें कि अन्य एसटीएल कंटेनरों में यह संपत्ति नहीं है।
तो, संक्षेप में: आम तौर पर बोल रहा है, तो आप आइटम सूची से, जबकि इसके माध्यम से पुनरावृत्ति को हटाना नहीं चाहिए, क्योंकि विलोपन इटरेटर (और कार्यक्रम संभवतः दुर्घटना होगा) अमान्य हो सकती है। यदि आप पूरी तरह से सुनिश्चित हैं कि आपके द्वारा हटाए गए आइटम किसी भी पुनरावर्तक द्वारा संदर्भित मान नहीं हैं जिन्हें आप हटाने के पल में उपयोग करते हैं, तो आप हटा सकते हैं।
सावधान रहें कि अन्य एसटीएल कंटेनर (उदा। वैक्टर) के लिए बाधा अधिक सख्त है: कंटेनर से हटाना न केवल हटाए गए आइटम को इंगित करने वाले इटरेटर को अमान्य करता है, बल्कि संभवतः अन्य इटरेटर भी! तो उन कंटेनरों से हटने के दौरान उन्हें और भी समस्याग्रस्त हो रहा है।
[एक एसटीएल सूची से मिटाया जा रहा है आइटम] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/501962/erasing-items-from-an-stl-list) – sth
हाँ, पर उस तरह से नहीं। –
संभावित डुप्लिकेट [क्या आप इसे std :: सूची से तत्वों को हटाते समय हटा सकते हैं?] (Http://stackoverflow.com/questions/596162/can-you-remove-elements-from-a-stdlist-while- iterating-through-it) – AShelly