使用谓词C ++ 11从unordered_map中擦除的非循环有效方法?

时间:2015-03-28 21:41:27

标签: predicate unordered-map erase remove-if

在使用容器时,建议使用算法和成员函数进行循环以提高效率。但是,关联容器(unordered_map)不能与erase(remove_if)范例一起使用,看起来常见的方法是回退到循环。

uom是一个std :: unordered_map

for(auto it = uom.begin() ; it!=uom.end(); ){
    if(it->second->toErase()) {
        delete it->second; // omit delete if using std::unique_ptr
        fpc.erase(it++);
    }else{
        ++it;
    }
}

//根据Scott Meyers Effective STL pg45

这是否尽可能高效?接缝应该有一个更好的方法来使用像erase(remove_if)范例这样的东西,但这适用于unordered_map(我知道关联容器不能"重新排序"因此不支持remove_if算法)。这真的是使用谓词从unordered_map中删除条目的最佳方法吗?有什么建议吗?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

尽可能高效。如果您想要更方便的东西,可以使用boost的erase_if模板 - 请参阅hereunordered_map维护每个存储桶中的节点链接列表,因此擦除它们很便宜。不需要remove-if type“压缩”,这适合std::vector使用连续记忆。