我有一个名为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;
}
但似乎效率很低。那么最有效的方法是什么呢?
答案 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);
}