2011-12-03 74 views
0

我做了一個關於這個網絡的好搜索,並提出了很多關於矢量的幫助,但沒有任何關於STL列表的東西。我試圖擦除地圖中列表的指針。 (有點棘手)。我真的想使用指針,而不是恢復到另一個(更糟糕的)做事系統。我會告訴代碼指針與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); 
} 

回答

3

我認爲它應該僅僅是這樣的:

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

如果你沒有lambda表達式,你必須自己編寫一些斷言,或者你去手動方式;但現在要小心循環:

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

+1的'remove_if'方法 –

+0

@SethCarnegie:謝謝你,帶我永遠明白了事情的原委:-S –

+0

對不起,這offtopic評論,但你可以推薦一本書或可以學到一些東西全部stdlib類和一切從?有效的STL已經過時了(現在我們已經有了C++ 11),並且對於已經熟悉STL的人來說也是如此。我知道數據結構和一些算法,但是我對stdlib的瞭解卻很痛苦。就像在這種情況下,我知道有一種方法可以用'remove_if'來做到這一點,因爲我已經看到了它,但我不知道該怎麼做。 –

0

有一堆東西是錯的。我將嘗試列出所有這些,雖然我可能會錯過一些:

  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)
+0

感謝所有的幫助,但我的指針系統都是錯誤的。我只是要採用一系列的方法(用int來代替指針,不要介意)你們似乎都很聰明,所以感謝你們的幫助! –