दिलचस्प पोस्ट
किसी UI के बिना गतिविधि कैसे लॉन्च की जाए? पायथन के माध्यम से लिनक्स पर प्रक्रिया सूची ValidateRequest = "false" एस्पनेट 4 में काम नहीं करता है IE में "सीमा-त्रिज्या" के लिए सहायता सरणियों के लिए शॉर्टहैंड: क्या कोई शाब्दिक सिंटैक्स {} या है? अजगर फ़ाइलों को संपादित करते समय लाइनों की शुरुआत में टिप्पणियां नहीं डालने के लिए vim को कॉन्फ़िगर कैसे करें आईओएस: डिवाइस वॉल्यूम बदलें आकार ऑपरेटर क्यों माना जाता है? हाइबरनेट 4 में सत्र फ़ैक्टरी बनाएं किसी फ़ोल्डर या जार से रनटाइम पर कक्षाएं कैसे लोड करें? संघ के साथ आदेश कैसे करें पीडीओ में PHP में, अंतिम एसक्यूएल पैरामीट्रीज की गई क्वेरी को कैसे जांचें? टेक्स्ट आकार और विभिन्न एंड्रॉइड स्क्रीन आकार जावा कोड में उपयोग किए जाने वाले किसी भी, एवलवैल, एएनआईआरएफ, ऑब्जेक्ट और वे कैसे मैप करते हैं, के बीच संबंध क्या हैं? सीएसएस की महत्वपूर्ण घोषणा क्या काम नहीं करती है?

प्रत्येक के लिए एक करते समय 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()); } 

वेब के समाधान से एकत्रित समाधान "प्रत्येक के लिए एक करते समय 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 दोनों में