Estoy iterando sobre un conjunto de funciones de devolución de llamada. Las funciones se invocan durante la iteración y pueden conducir a cambios drásticos en el contenedor real de las funciones establecidas.Iteración de un contenedor cambiante
Lo que estoy haciendo ahora es:
- hacer una copia del conjunto original
- iterar sobre la copia, pero por cada elemento compruebe si todavía existe en el conjunto original
Comprobación porque la existencia de cada elemento es súper dinámica, pero también parece bastante lenta.
¿Hay otras propuestas para abordar este caso?
Editar: aquí está el código real: enfoques
// => 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);
}
};
Por "set" Qué quiere decir 'std :: set <>'? Si no, ¿cuál es el tipo de contenedor real? – ildjarn
Bueno, quería dejar este genérico, pero sí, es un estándar :: set –