दिलचस्प पोस्ट
बाइंडिंग क्या WPF में स्मृति लीक बना सकते हैं? पायथन 2 से urllib2 के साथ HTTP हेड अनुरोध बनाना JSlint: 'के लिए' अप्रत्याशित ' रिएक्टर में माता-पिता की स्थिति को कैसे अद्यतन करें? जावा स्ट्रिंग मान से मैं कैसे तलाश सकता हूं? जावास्क्रिप्ट, ब्राउज़र, खिड़की बंद – एक AJAX अनुरोध भेजें या विंडो बंद पर एक स्क्रिप्ट चलाने के लिए और foreach के बीच अंतर क्या है? वर्तमान टुकड़ा ऑब्जेक्ट प्राप्त करें MsysGit पोर्टेबल $ HOME स्थान को ठीक करें मैं HTML कैनवास के साथ बाढ़ भर कैसे कर सकता हूं? यादृच्छिक संख्या जनरेटर जो एक शक्ति-कानून वितरण का उत्पादन करता है? एक एनन के साथ सिंगलटन कार्यान्वित करना (जावा में) Log4j xml कॉन्फ़िगरेशन में सिस्टम पर्यावरण चर का उपयोग करना एनडीईएफ एंड्रॉइड एप्लीकेशन रिकॉर्ड्स (एएआर) के साथ एनएफसी टैग प्राप्त करें क्या SQL के साथ एसक्यूएलजीओजी का इस्तेमाल करना संभव है?

प्रत्येक के लिए एक करते समय std :: vector से मिटा रहा है?

पुनरावृत्त करने का उचित तरीका यह है कि वे हेरोटरों का उपयोग करें। हालांकि, मुझे लगता है कि मिटाकर, इटरेटर अमान्य है।

असल में मैं क्या करना चाहता हूं:

for(iterator it = begin; it != end; ++it) { if(it->somecondition() ) { erase it } } 

मैं बिना किसी वि [i] विधि के कैसे कर सकता हूं?

धन्यवाद

 struct RemoveTimedEvent { bool operator()(const AguiTimedEvent& pX, AguiWidgetBase* widget) const { return pX.getCaller() == widget; } }; void AguiWidgetContainer::clearTimedEvents( AguiWidgetBase* widget ) { std::vector<AguiTimedEvent>::iterator it = std::remove_if(timedEvents.begin(), timedEvents.end(), RemoveTimedEvent()); timedEvents.erase(it, timedEvents.end()); } 

Solutions Collecting From Web of "प्रत्येक के लिए एक करते समय std :: vector से मिटा रहा है?"

erase() एक नया इटरेटर देता है:

 for(iterator it = begin; it != end(container) /* !!! */;) { if (it->somecondition()) { it = vec.erase(it); // Returns the new iterator to continue from. } else { ++it; } } 

ध्यान दें कि हम इसे किसी सटीक अंत के साथ तुलना नहीं कर सकते, क्योंकि हम इसे मिटा सकते हैं और इसलिए इसे अमान्य कर सकते हैं। हमें प्रत्येक बार अंत स्पष्ट रूप से प्राप्त करना चाहिए।

एक बेहतर तरीका हो सकता है कि std::remove_if और std::remove_if erase() std::remove_if । आप हे (एन) के लिए ओ (एन 2 ) (हर तत्व मिट जाता है और स्थानांतरित किया जाता है) होने से बदलते हैं:

 iterator it = std::remove_if(begin, end, pred); vec.erase(it, vec.end()); 

जहां पूर्व अपने निष्कासन की बात है, जैसे:

 struct predicate // do choose a better name { bool operator()(const T& pX) const // replace T with your type { return pX.shouldIBeRemoved(); } }; iterator it = std::remove_if(begin, end, predicate()); vec.erase(it, vec.end()); 

आपके मामले में, आप इसे बहुत सामान्य बना सकते हैं:

 class remove_by_caller { public: remove_by_caller(AguiWidgetBase* pWidget) : mWidget(pWidget) {} // if every thing that has getCaller has a base, use that instead template <typename T> // for now a template bool operator()(const T& pX) const { return pX.getCaller() == mWidget; } private: AguiWidgetBase* mWidget; }; std::vector<AguiTimedEvent>::iterator it = std::remove_if(timedEvents.begin(), timedEvents.end(), remove_by_caller(widget)); timedEvents.erase(it, timedEvents.end()); 

ध्यान दें लैम्ब्डा इस प्रक्रिया को सरल बनाने के लिए मौजूद है, बूस्ट और सी ++ 11 दोनों में