2013-01-25 40 views
1

我想知道是否有可能使用remove_if和lambda表達式表示此表達式。list :: 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; 
      } 
     } 
+0

這是行不通的? http://en.cppreference.com/w/cpp/container/list/remove – chris

回答

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的情況非常窄。

2

更好地利用smart pointerslambda

嘗試:

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