list :: remove_if эквивалент

Я хотел бы знать, возможно ли представить это выражение, используя remove_if и лямбда-выражение.

        std::list< gh::Actor* >::iterator astit = actors.begin();
while (astit != actors.end())
{
if( (*astit)->state == DELETE_STATE )
{
Actor* reference = *astit;
actors.erase(astit++);

delete reference;
}
else
{
++astit;
}
}

1

Решение

actors.erase(
std::remove_if( actors.begin(), actors.end(), []( gh::Actor*a )->bool {
if (!a || a->state == DELETE_STATE) {
delete a;
return true;
} else {
return false;
}
}),
actors.end()
);

Кроме того, вы почти наверняка не хотите использовать std::list, использование std::vector — случаи, когда std::list Превосходит std::vector чрезвычайно узки.

2

Другие решения

Лучше использовать smart pointers с lambda,

Пытаться:

std::list<std::shared_ptr<gh::Actor>> actors;
actors.remove_if([](std::shared_ptr<Actor>& a){ return a->state == DELETE_STATE; });
2

По вопросам рекламы [email protected]