2013-01-13 11 views
9

के लिए एक सी ++ 11 में std :: सूची के तत्वों को मिटाना संभव है, मैं प्रत्येक लूप के लिए नए सी ++ 11 का उपयोग सूची के सभी तत्वों पर पुनरावृत्त करने और प्रमाण तत्वों को मिटाने के लिए करना चाहता हूं। उदाहरण के लिएक्या प्रत्येक लूप

std::list<int> myList; 
myList.push_back(1); 
myList.push_back(13); 
myList.push_back(9); 
myList.push_back(4); 

for(int element : myList) { 
    if(element > 5) { 
     //Do something with the element 

     //erase the element 
    }else{ 
     //Do something else with the element 
    } 
} 

यह प्रत्येक पाश के लिए उपयोग कर यह करने के लिए या मैं इस हासिल करने के लिए iterators के लिए वापस जाने की क्या ज़रूरत है संभव है?

+3

आप remove_if/मिटा का उपयोग क्यों नहीं कर सकते? –

+3

या सिर्फ 'सूची :: remove_if', कोई इटरेटर आवश्यक नहीं है। –

+0

@ कार्तिकट और @ बेंजामिन लिंडले: क्षमा करें, मैंने अपने प्रश्न में उल्लेख नहीं किया। मैं उन तत्वों के साथ कुछ सामान करना चाहता हूं जो इस शर्त को पूरा करते हैं और अन्य सभी के साथ भी। मैं शायद इसे 'list :: remove_if' द्वारा उपयोग किए गए पूर्वानुमान फ़ंक्शन में डाल सकता हूं, लेकिन मुझे लगता है कि यह बहुत अच्छा नहीं है। प्रसंस्करण की प्रकृति के आधार पर – Haatschii

उत्तर

6

आप सिर्फ इस

myList.erase(std::remove_if(myList.begin(), myList.end(), 
    [](int& element) 
    { 
     return element > 5; 
    } 
    ),myList.end()); 

या बस (सौजन्य बेंजामिन लिंडले) ऐसा करने में सक्षम होना चाहिए

myList.remove_if(
    [](int& element) 
    { 
     return element > 5; 
    } 
    ); 
+2

स्थानांतरण तत्व एक सूची –

+0

एचएम के लिए बहुत अक्षम है, अच्छा संपादन :) लेकिन प्रतीक्षा करें ... 'std :: erase'? क्या आपने * संकलित * करने की कोशिश की है? –

+2

@ Cheersandhth.-Alf मुझे विश्वास है कि आप गलत हैं, हटाने और डालने के लिए ओ (1) std :: सूची के लिए है। अनुक्रमिक कंटेनर जैसे std :: वेक्टर के लिए स्थानांतरण होगा। –

0

नहीं, मैं ऐसा नहीं सोचता। this SO answer:

नहीं, आप नहीं कर सकते। रेंज-आधारित है जब आपको एक बार कंटेनर के प्रत्येक तत्व को एक्सेस करने की आवश्यकता होती है।

आप पाश के लिए सामान्य उपयोग करना चाहिए या इसे से एक चचेरे भाई है कि अगर आप जरूरत कंटेनर को संशोधित करने के लिए आगे बढ़ते हुए, एक तत्व का उपयोग एक से अधिक एक बार, या अन्यथा कंटेनर के माध्यम से एक गैर रैखिक फैशन में पुनरावृति ।

5

आप ऐसी श्रेणी के आधार पर कि कंटेनर से अधिक पाश के लिए में मानक कंटेनर के तत्वों को मिटा नहीं सकते हैं - पाश ही तत्व यह है कि आप वर्तमान में जा रहे हैं पुनरावर्तक है, और मिटा यह है कि इटरेटर अमान्य हैं लूप बढ़ने से पहले।

रेंज आधारित के लिए मानक के 6.5.4 में परिभाषित किया गया है के बराबर (थोड़ा सरलीकृत) होने के लिए:

for (auto __begin=begin-expr, __end=end-expr; __begin != __end; ++__begin) { 
    for-range-declaration = *__begin; 
    statement 
} 

begin-expr और end-expr अपने स्वयं लंबा परिभाषा है, लेकिन अपने उदाहरण में वे कर रहे हैं और myList.begin() क्रमशः myList.end()