确定 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只是垃圾数据。
iter
如果我取消注释掉这一行:
Bar b2 = m[2]
调试器显示b2是{i = 0}. (我猜这意味着使用未定义的索引将返回一个包含所有空/未初始化值的结构?)
b2
{i = 0}
这些方法都不是那么好。我真正想要的是这样的界面:
bool getValue(int key, Bar& out) { if (map contains value for key) { out = map[key]; return true; } return false; }
这些方面的东西是否存在?
没有。使用 stl map 类,您::find()可以搜索地图,并将返回的迭代器与std::map::end()
::find()
std::map::end()
所以
map<int,Bar>::iterator it = m.find('2'); Bar b3; if(it != m.end()) { //element found; b3 = it->second; }
显然,您可以根据需要编写自己的getValue()例程(同样在 C++ 中,没有理由使用out),但我怀疑一旦您掌握了使用的窍门,std::map::find()您就不想浪费时间了。
getValue()
out
std::map::find()
您的代码也略有错误:
m.find('2');将在地图上搜索一个键值,即'2'. IIRC C++ 编译器会将“2”隐式转换为 int,这会导致“2”的 ASCII 代码的数值不是您想要的。
m.find('2');
'2'
由于您在此示例中的键类型是int您想要这样搜索: m.find(2);
int
m.find(2);