Suena como un trabajo para std::remove_copy_if
y std::remove_if
: (no he probado esto, pero hay que darle la idea ...)
#include <algorithm>
#include <functional>
//I'm sure you probably already have a delete functor lying around, right?
// No? Well here's one for you....
struct Deleter : public std::unary_function<AguiTimedEvent*, void>
{
void operator()(AguiTimedEvent* toNuke)
{
delete toNuke;
}
};
std::vector<AguiTimedEvent*> toRun;
std::remove_copy_if(timedEvents.begin(), timedEvents.end(),
std::back_inserter(toRun), std::not1(std::mem_fun(&AguiTimedEvent::expired)));
timedEvents.erase(std::remove_if(timedEvents.begin(), timedEvents.end(),
std::mem_fun(&AguiTimedEvent::expired), timedEvents.end());
std::for_each(toRun.begin(), toRun.end(),
std::mem_fun(&AguiTimedEvent::timedEventCallback));
std::for_each(toRun.begin(), toRun.end(), Deleter());
Tenga en cuenta que esta solución requiere tiempo lineal, mientras que el suyo toma tiempo cuadrádico Esto también elimina limpiamente el problema que las devoluciones de llamada podrían agregar al nuevo vector eliminando las decisiones sobre eso hasta después de que ya se haya realizado la eliminación del vector. Por otro lado, verifica el indicador expired
dos veces, por lo que si se trata de una operación compleja, esto podría ser más lento.
¿Cuál es el texto de error exacto? – Tom
Expresión: iterador de vector no referenciable (error de aserción de depuración) – jmasterx
¿El destructor 'timedEventCallback' o' AguiTimedEvent' modifica directa o indirectamente 'timedEvents'? –