确定STL映射是否包含给定键的值的最佳方法是什么?
#include <map>
using namespace std;
struct Bar
{
int i;
};
int main()
{
map<int, Bar> m;
Bar b = {0};
Bar b1 = {1};
m[0] = b;
m[1] = b1;
//Bar b2 = m[2];
map<int, Bar>::iterator iter = m.find(2);
Bar b3 = iter->second;
}
在调试器中检查它,iter看起来只是垃圾数据。
如果我取消注释这一行:
Bar b2 = m[2]
调试器显示b2是{i = 0}。(我猜这意味着使用一个未定义的索引将返回一个结构与所有空/未初始化的值?)
这两种方法都不是很好。我真正想要的是这样一个界面:
bool getValue(int key, Bar& out)
{
if (map contains value for key)
{
out = map[key];
return true;
}
return false;
}
是否存在类似的情况?
Map提供了2个成员函数来检查Map中给定的键是否存在不同的返回值。
Std::map::find(返回迭代器)
Std::map::count(返回计数)
使用std::map::count检查map是否包含键
它查找并返回map中键为k的元素的数量,因为map只包含键为唯一的元素。因此,如果key存在,它将返回1,否则为0。
使用std::map::find检查map是否包含键
它检查map中是否存在键值为“k”的元素,如果存在,则返回其迭代器else
它返回map的结束。
更多细节和例子参考下面的链接(容易理解的解释)。
来源:https://thispointer.com/how-check-if-a-given-key-exists-in-a-map-c/
简单总结一下其他的一些答案:
如果你还没有使用c++ 20,你可以编写自己的mapContainsKey函数:
bool mapContainsKey(std::map<int, int>& map, int key)
{
if (map.find(key) == map.end()) return false;
return true;
}
如果你想避免map和unordered_map以及不同键和值类型的很多重载,你可以把它做成一个模板函数。
如果你使用c++ 20或更高版本,会有一个内置的contains函数:
std::map<int, int> myMap;
// do stuff with myMap here
int key = 123;
if (myMap.contains(key))
{
// stuff here
}