带有STL地图和列表的指针

时间:2011-12-03 22:49:41

标签: c++ class stl iterator

我确实在网上搜索了这个并且提供了很多关于向量的帮助,但在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 个答案:

答案 0 :(得分:3)

我认为它应该是这样的:

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

如果你没有lambdas,你必须自己写一个小谓词,或者你去手动方式;但现在要小心循环:

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

答案 1 :(得分:0)

有一堆错误。我会尝试列出所有这些,但我可能会错过一些:

  1. 如果正如您所说,您的列表包含指针
  2. ,则应为list<GamePlayer*>::iterator itit;
  3. 应该是itit = roomlist[roomid].playerlist.begin();,而不是itit = ...,就像KerrekSB所说
  4. 应该是itit != roomlist[roomid].playerlist.end(),而不是itit != itit.end()
  5. 应该是if( (*itit)->socketno == socketid ),而不是if( itit.socketno == socketid )(如果您的列表包含指针,则应该再次)
  6. 应该是roomlist[roomid].playerlist.erase(itit),而不是itit.erase(itit)