2014-10-23 8 views
5

में आइटम को मिटाना क्या इस तरह के लूप में ऑटो चर का उपयोग करते समय विशिष्ट तत्वों को मिटाने का कोई तरीका है?किसी के लिए (-each) ऑटो लूप

for(auto a: m_Connections) 
{ 
    if(something) 
    { 
     //Erase this element 

    } 
} 

मुझे लगता है मैं या तो कह सकते हैं करते

for(auto it=m_map.begin() ... 

या

for(map<int,int>::iterator it=m_map.begin() ... 

और मैन्युअल इटरेटर को बढ़ा देते हैं (और मिटा) लेकिन अगर मैं कोड मैं के कम लाइनों के साथ यह कर सकता है पता खुश रहो

धन्यवाद!

+0

मिटाने के साथ आपका क्या मतलब है? – Etixpp

+0

m_Connections.erase (इसे); 'अन्य उदाहरणों' में। – Valmond

उत्तर

5

नहीं, ऐसा नहीं है। लूप के लिए रेंज का उपयोग एक कंटेनर के प्रत्येक तत्व को एक बार एक्सेस करने के लिए किया जाता है।

हर बार जब कंटेनर से तत्व हटा दिया जाता है, तो मिटाए गए तत्व पर या उसके बाद इटरेटर मान्य नहीं होते हैं (और the implementation of the range-based-for यह एक समस्या है)।

यदि आपको कंटेनर को संशोधित करने की आवश्यकता है तो आपको लूप (या while) के लिए सामान्य उपयोग करना चाहिए।

आप तत्व है जो के लिए एक विधेय रिटर्न true, एक अच्छा तरीका है मिटाना चाहते हैं:

m_Connections.erase(
    std::remove_if(m_Connections.begin(), 
       m_Connections.end(), 
       [](Type elem) { return predicate(elem); }), 
    m_Connections.end()); 

std::remove_if विधेय के साथ यात्रा तर्क मिश्रण नहीं है।

1

धक्का सरणी में सभी तत्वों और फिर आइटम

+0

बिल्कुल कम कोड नहीं होगा, जो ओपी के लिए लक्ष्य था। – joaerl

3

आप इटरेटर की जरूरत को हटाने के लिए पॉप आपरेशन करना यदि आप एक कंटेनर से एक तत्व को मिटाना चाहते हैं।
और आप तत्व से ही इटरेटर नहीं प्राप्त कर सकते हैं - और यदि आप कर सकते हैं, उदाहरण के लिए vector के साथ, आंतरिक रूप से उपयोग के लिए श्रेणीबद्ध इटरेटर को अगले चरण में अपरिभाषित व्यवहार के कारण अमान्य कर दिया जाएगा।

तो जवाब है: नहीं, इसके क्लासिक उपयोग में आप नहीं कर सकते हैं। श्रेणी-आधारित के लिए पूरी तरह से एक श्रृंखला में सभी तत्वों के सुविधाजनक पुनरावृत्ति के लिए डिजाइन किया गया था।

5

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

आप एक पुराने स्कूल पाश की आवश्यकता होगी,

for (auto it = container.begin(); it != container.end();) { 
    if (something) { 
     it = container.erase(it); 
    } else { 
     ++it; 
    } 
} 

की तर्ज या container.erase() और std::remove_if का एक संयोजन के साथ, अगर आप बात की इस प्रकार की तरह।

+0

व्यक्तिगत स्वाद: 'जबकि (यह! = अंत (कंटेनर) का उपयोग करें) {} ' – Alex

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