首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std::map的remove_if等效项

std::map的remove_if等效项
EN

Stack Overflow用户
提问于 2009-04-29 05:05:31
回答 9查看 69K关注 0票数 137

我试图根据特定条件从map中删除一系列元素。如何使用STL算法完成此任务?

最初,我想使用remove_if,但这是不可能的,因为remove_if不适用于关联容器。

有没有适用于map的"remove_if“等价算法?

作为一个简单的选择,我想到了遍历地图和擦除。但是遍历map和擦除是否是一个安全的选项呢?(因为迭代器在擦除之后变得无效)

我使用了以下示例:

代码语言:javascript
复制
bool predicate(const std::pair<int,std::string>& x)
{
    return x.first > 2;
}

int main(void) 
{

    std::map<int, std::string> aMap;

    aMap[2] = "two";
    aMap[3] = "three";
    aMap[4] = "four";
    aMap[5] = "five";
    aMap[6] = "six";

//      does not work, an error
//  std::remove_if(aMap.begin(), aMap.end(), predicate);

    std::map<int, std::string>::iterator iter = aMap.begin();
    std::map<int, std::string>::iterator endIter = aMap.end();

    for(; iter != endIter; ++iter)
    {
            if(Some Condition)
            {
                            // is it safe ?
                aMap.erase(iter++);
            }
    }

    return 0;
}
EN

回答 9

Stack Overflow用户

发布于 2013-05-17 04:39:23

用于std::map (和其他容器)的erase_if

我使用下面的模板来做这件事。

代码语言:javascript
复制
namespace stuff {
  template< typename ContainerT, typename PredicateT >
  void erase_if( ContainerT& items, const PredicateT& predicate ) {
    for( auto it = items.begin(); it != items.end(); ) {
      if( predicate(*it) ) it = items.erase(it);
      else ++it;
    }
  }
}

这不会返回任何内容,但会从std::map中删除这些项。

使用示例:

代码语言:javascript
复制
// 'container' could be a std::map
// 'item_type' is what you might store in your container
using stuff::erase_if;
erase_if(container, []( item_type& item ) {
  return /* insert appropriate test */;
});

第二个示例(允许您传入测试值):

代码语言:javascript
复制
// 'test_value' is value that you might inject into your predicate.
// 'property' is just used to provide a stand-in test
using stuff::erase_if;
int test_value = 4;  // or use whatever appropriate type and value
erase_if(container, [&test_value]( item_type& item ) {
  return item.property < test_value;  // or whatever appropriate test
});
票数 82
EN

Stack Overflow用户

发布于 2017-04-07 23:41:21

现在,可以在header <experimental/map>中使用std::experimental::erase_if

请参阅:http://en.cppreference.com/w/cpp/experimental/map/erase_if

票数 8
EN

Stack Overflow用户

发布于 2019-11-06 21:23:59

这里有一些优雅的解决方案。

代码语言:javascript
复制
for (auto it = map.begin(); it != map.end();)
{   
    (SomeCondition) ? map.erase(it++) : (++it);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/800955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档