gpt4 book ai didi

c++ - 从 unordered_map 中删除值的有效方法,当只给出值 C++

转载 作者:行者123 更新时间:2023-11-27 22:58:19 27 4
gpt4 key购买 nike

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

通常,从我的 unordered_map 中删除对象时, 我可以做 iterator = find(id)然后调用erase在那个迭代器上。

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

int DataSet::DeleteObject(Object* object)

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

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

但是看起来效率很低。那么,实现这一目标的最有效方法是什么?

最佳答案

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

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! */ }

关于c++ - 从 unordered_map 中删除值的有效方法,当只给出值 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335156/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com