小编典典

确定地图是否包含键的值?

all

确定 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;
}

这些方面的东西是否存在?


阅读 71

收藏
2022-04-21

共1个答案

小编典典

这些方面的东西是否存在?

没有。使用 stl map
类,您::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()您就不想浪费时间了。

您的代码也略有错误:

m.find('2');将在地图上搜索一个键值,即'2'. IIRC C++ 编译器会将“2”隐式转换为 int,这会导致“2”的 ASCII
代码的数值不是您想要的。

由于您在此示例中的键类型是int您想要这样搜索: m.find(2);

2022-04-21