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

std::map的remove_if等效项
EN

Stack Overflow用户
提问于 2009-04-29 05:05:31
回答 14查看 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

Stack Overflow用户

发布于 2013-01-17 02:14:38

原始代码只有一个问题:

代码语言:javascript
运行
复制
for(; iter != endIter; ++iter)
{
    if(Some Condition)
    {
        // is it safe ?
        aMap.erase(iter++);
    }
}

在这里,iter在for循环中递增一次,在erase中递增一次,这可能会在某个无限循环中结束。

票数 2
EN
查看全部 14 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/800955

复制
相关文章

相似问题

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