मैं कॉलबैक फ़ंक्शंस के एक सेट पर फिर से चल रहा हूं। कार्यों को पुनरावृत्ति के दौरान बुलाया जाता है और कार्यों के सेट के वास्तविक कंटेनर में कठोर परिवर्तन हो सकता है।एक बदलते कंटेनर को इटरेट करना
क्या मैं अब कर रहा हूँ है:
- मूल सेट प्रति अधिक
- पुनरावृति की एक प्रतिलिपि बनाने, लेकिन प्रत्येक तत्व के लिए जाँच करें कि क्या यह अभी भी मूल सेट
जाँच में मौजूद है प्रत्येक तत्व के अस्तित्व के लिए सुपर गतिशील है, लेकिन यह भी धीमा लगता है।
क्या इस मामले से निपटने के लिए अन्य प्रस्ताव हैं?
संपादित करें:
// => i = event id
template <class Param>
void dispatchEvent(int i, Param param) {
EventReceiverSet processingNow;
const EventReceiverSet& eventReceiverSet = eventReceiverSets[i];
std::copy(eventReceiverSet.begin(), eventReceiverSet.end(), std::inserter(processingNow, processingNow.begin()));
while (!processingNow.empty()) {
EventReceiverSet::iterator it = processingNow.begin();
IFunction<>* function = it->getIFunction(); /// get function before removing iterator
processingNow.erase(it);
// is EventReceiver still valid? (may have been removed from original set)
if (eventReceiverSet.find(ERWrapper(function)) == eventReceiverSet.end()) continue; // not found
function->call(param);
}
};
तक "सेट" आप क्या मतलब है 'std :: सेट <>'? यदि नहीं, वास्तविक कंटेनर प्रकार क्या है? – ildjarn
ठीक है, मैं यह सामान्य छोड़ना चाहता था, लेकिन हाँ, यह एक std :: set –