दिलचस्प पोस्ट
ग्रहण जून शुरू नहीं करता है जावा स्विंग बटन रंग पायथन के लिए क्या आईडीई का उपयोग करना है? क्रोम: पृष्ठभूमि टैब में समय समाप्ति / अंतराल निलंबित? उपयोगकर्ता 'DOMAIN \ MACHINENAME $' के लिए लॉगइन विफल प्रॉक्सी के पीछे से एसबीटी का उपयोग कैसे करें? डेटाबेस डिजाइन – लेख, ब्लॉग पोस्ट, फोटो, कहानियां मैं रूबी के अंदर से C ++ फ़ंक्शन कैसे कॉल कर सकता हूं रैखिक लयआउट प्रोग्राम में मार्जिन सेट करें क्या विंडोज़ पर बिल्ली के लिए जगह है? "हमारा" और "उनकी" का अर्थ git-svn के साथ उलट क्यों है SSL में उपयोग करने के लिए जावा कीस्टोर में मौजूदा x509 प्रमाणपत्र और निजी कुंजी को कैसे आयात करें? टॉमकेट में संदर्भों के बीच सत्र डेटा साझा करना जेएस की जगह स्ट्रिंग पर काम नहीं बदली सरणी तत्वों की प्रतियां दोहराएं: MATLAB में रन-लेटरी डिकोडिंग

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