当给定值C ++时,从unordered_map中删除值的有效方法

时间:2015-05-19 20:06:19

标签: c++ iterator unordered-map

我有一个名为Object的抽象类,我使用std::unordered_map<int, Object*> objects在名为Object的类中包含这些DataSet。每个对象都有id与之关联。

通常,从我的unordered_map删除对象时,我只能执行iterator = find(id),然后在该迭代器上调用erase

这很简单有效。问题是,我必须实现一种方法来按值删除条目/对,而不是按键(这是我的id)。这给了我以下原型:

int DataSet::DeleteObject(Object* object)

实现这一目标的最有效方法是什么?我想我可以做这样的事情:

if(object){
    for(auto kv : objects) {
        if(kv.second == object) {
            objects.erase(kv);
        }
    }
    return 1;
}

但似乎效率很低。那么最有效的方法是什么呢?

1 个答案:

答案 0 :(得分:4)

不要执行两次查找;通过迭代器擦除:

for (auto it = m.begin(); it != m.end(); )
{
    if (it->second == needle) { m.erase(it++); }
    else                      { ++it;          }
}

这会删除所有needle。如果要在第一次出现时最多擦除,则会执行更简单的循环:

for (auto it = m.begin(); it != m.end(); ++it)
{
    if (it->second == needle) { m.erase(it); break; }
}

如果您想要删除完全一个元素,您需要添加一个检查,找到任何针。这可以通过find_if来实现,auto it = std::find_if(m.begin(), m.end(), [&needle](const auto & p) { return p.second == needle; }); if (it != m.end()) { m.erase(it); } else { /* no such element! */ } 也可以用作以前算法的变体:

#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES sTexture;
varying vec2 texCoord;
    void main() {
    gl_FragColor = texture2D(sTexture,texCoord);
}