list :: remove_if等价物

时间:2013-01-25 00:41:10

标签: c++ list remove-if

我想知道是否可以使用remove_if和lambda表达式来表示这个表达式。

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

2 个答案:

答案 0 :(得分: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; });

答案 1 :(得分: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的情况非常狭窄。