1

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;
            }
        }
4

2 に答える 2

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; });
于 2013-01-25T00:47:12.483 に答える
2
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が非常に狭い場合。

于 2013-01-25T00:58:37.923 に答える