【问题标题】:Pointers with STL maps and lists带有 STL 映射和列表的指针
【发布时间】:2011-12-03 22:49:41
【问题描述】:

我确实在网上对此进行了很好的搜索,并找到了很多关于向量的帮助,但在 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 );
}

【问题讨论】:

    标签: c++ class stl iterator


    【解决方案1】:

    我觉得应该是这样的:

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

    【讨论】:

    • @SethCarnegie:谢谢,让我永远明白发生了什么:-S
    • 很抱歉这个离题的评论,但你能推荐一本书或其他东西来学习所有的 stdlib 类和一切吗?有效的 STL 已经过时(现在我们有了 C++11),而且对于已经充分了解 STL 的人来说也是如此。我知道数据结构和一些算法,但是我对标准库的了解却非常缺乏。就像在这种情况下,我知道有一种方法可以使用 remove_if 来做到这一点,因为我在 SO 周围看到过它,但我不知道该怎么做。
    • @SethCarnegie:查看我们的常见问题解答,某处有“好书”帖子。我认为 Herb Sutter 有几本书明确地通过图书馆容器,虽然我没有得到/阅读它。或者只是阅读the standard,第 23/24/25 节;或浏览其中一个参考网站,或在 SO 聊天中提问! :-)
    • @Seth Carnegie 查看第 9 频道,STL 有很多关于新标准以及 VC 2010/2011 支持的视频。他对标准模板库视频系列有很好的介绍,我建议你看看。
    • @johnathon:Link #1: STL,Link #2: ASTL。链接包含指向所有剧集的进一步链接。赛斯:是的,STL 是real boy。
    【解决方案2】:

    有很多事情是错误的。我将尝试列出所有这些,尽管我可能会错过一些:

    1. 应该是list&lt;GamePlayer*&gt;::iterator itit;,如果如您所说,您的列表包含指针
    2. 应该是 itit = roomlist[roomid].playerlist.begin();,而不是 itit = ...,就像 KerrekSB 说的那样
    3. 应该是itit != roomlist[roomid].playerlist.end(),而不是itit != itit.end()
    4. 应该是if( (*itit)-&gt;socketno == socketid ),而不是if( itit.socketno == socketid )(同样,如果您的列表包含指针)
    5. 应该是roomlist[roomid].playerlist.erase(itit),而不是itit.erase(itit)。

    【讨论】:

    • 感谢所有的帮助,但我的指针系统全都出问题了。我将采用串行方法(使用 int 而不是指针来引用,没关系)你们看起来都很聪明,所以感谢您的帮助!
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2012-08-04
    • 2019-10-03
    相关资源
    最近更新 更多