Похоже на работу для std::remove_copy_if
и std::remove_if
: (Не проверял это, но это должно дать вам идею ...)
#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());
Обратите внимание, что это решение требует линейного времени, а ваше - квадратичного. Это также чисто избавляет от проблемы, которую обратные вызовы могут добавить к новому вектору, удаляя решения об этом до тех пор, пока удаление из вектора уже не будет выполнено. С другой стороны, он дважды проверяет флаг expired
, поэтому, если это сложная операция, она может быть медленнее.