当前位置:  开发笔记 > 编程语言 > 正文

如何过滤std :: map中的项目?

如何解决《如何过滤std::map中的项目?》经验,为你挑选了2个好方法。



1> Martin York..:

Mark Ransom算法的一种变体,但不需要临时的.

for(Actions::iterator it = _actions.begin();it != _actions.end();)
{
    if (expired(*it))
    {
        bar(*it);
        _actions.erase(it++);  // Note the post increment here.
                               // This increments 'it' and returns a copy of
                               // the original 'it' to be used by erase()
    }
    else
    {
        ++it;  // Use Pre-Increment here as it is more effecient
               // Because no copy of it is required.
    }
}


做得很好.太糟糕了我花了2年半的时间才看到这个改进.

2> Mark Ransom..:

你可以使用erase(),但我不知道BOOST_FOREACH将如何处理无效的迭代器.map :: erase的文档说明只有擦除的迭代器才会失效,其他的应该没问题.这是我如何重构内循环:

Actions::iterator it = _actions.begin();
while (it != _actions.end())
{
  if (expired(*it))
  {
    bar(*it);
    Actions::iterator toerase = it;
    ++it;
    _actions.erase(toerase);
  }
  else
    ++it;
}

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有