如何防止 unordered_map.find() 与错误的结束迭代器进行比较?

问题描述 投票:0回答:1

我们刚刚在代码中发现了一个错误,如下所示:

class foo {
    unordered_map<int,string> m_someMap;
public:
     void stuff() {
        unordered_map<int, string> someMap;
        ...
        auto it = someMap.find(x);
        if (it != m_someMap.end()) { // oops! comparing to the end() of a wrong map!
             // found x 
        }
     }
}

这里明显的问题是检查

find()
是否成功需要命名地图两次,如果这两次出现不同步,用户要小心。

防止这种情况的最佳做法是什么?换句话说,如何检查地图中是否存在某个项目,而不必说两次地图名称?

我希望地图迭代器可以转换为

bool
,这样我就可以编写简单的
if (it)...
,但事实并非如此。

还有其他想法吗?返回

safe_find()
optional<unordered_map<int,string>::iterator>>
模板函数?现代标准库有什么魔力?

c++ dictionary stl iterator unordered-map
1个回答
0
投票

您可以创建免费的模板功能,以避免任何意外:

template<typename K, typename V>
static bool exists_in_unordered_map(const std::unordered_map<K, V>& m, const K& key)
{
    return m.find(key) != m.end();
}

然后在任何你想要的地方使用它:

if (exists_in_unordered_map(someMap, x))
{
    // found x, now do something here
}
© www.soinside.com 2019 - 2024. All rights reserved.