Указатели с картами и списками STL - PullRequest
0 голосов
/ 04 декабря 2011

Я сделал хороший поиск в сети по этому поводу и нашел много справок относительно векторов, но на самом деле ничего не было в списках STL. Я пытаюсь удалить указатель из списка на карте. (немного сложно). Я действительно хочу использовать указатели и не возвращаться к другой (худшей) системе ведения дел. Я покажу код

bool RoomDB::removePlayer( int socketid, int roomid )   {

list<GamePlayer>::iterator itit;

 for( itit == roomlist[roomid].playerlist.begin(); itit != itit.end(); itit++ ) {
    if( itit.socketno == socketid )
    itit.erase( itit );
}

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Я думаю, что это должно быть так:

roomlist[roomid].playerlist.remove_if(
    [socketid](GamePlayer const & gp) { return gp.socketno == socketid; }
);

Если у вас нет лямбд, вам придется написать небольшой предикат самостоятельно, или вы пойдете ручным путем; но теперь остерегайтесь петли:

for (std::list<GamePlayer>::iterator it = roomlist[roomid].playerlist.begin();
     it != roomlist[roomid].playerlist.end();  /* no increment */ )
{
   if (it->socketno == socketid)
   {
     it = roomlist[roomid].playerlist.erase(it);
   }
   else
   {
     ++it;
   }
}
0 голосов
/ 04 декабря 2011

Есть куча неправильных вещей.Я постараюсь перечислить все из них, хотя я могу пропустить некоторые из них:

  1. Это должно быть list<GamePlayer*>::iterator itit;, если, как вы говорите, ваши списки содержат указатели
  2. Это должно быть itit = roomlist[roomid].playerlist.begin();, а не itit = ..., как сказал KerrekSB
  3. Это должно быть itit != roomlist[roomid].playerlist.end(), а не itit != itit.end()
  4. Это должно быть if( (*itit)->socketno == socketid ), а не if( itit.socketno == socketid ) (опять же, если вашсписок содержит указатели)
  5. Это должно быть roomlist[roomid].playerlist.erase(itit), а не itit.erase(itit).
...