我们刚刚在代码中发现了一个错误,如下所示:
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>>
模板函数?现代标准库有什么魔力?
您可以创建免费的模板功能,以避免任何意外:
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
}