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

新手上路,请多包涵

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

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

原文由 Nick Heiner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 284
2 个回答

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

没有。使用 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);

原文由 Alan 发布,翻译遵循 CC BY-SA 3.0 许可协议

Map 提供了 2 个成员函数来检查给定的键是否存在于具有不同返回值的映射中,即

  1. std::map::find (返回迭代器)

  2. std::map::count (返回计数)

  • 使用 std::map::count 检查 map 是否包含键

它使用键 K 查找并返回映射中元素的数量。因为映射仅包含具有唯一键的元素。因此,如果 key 存在则返回 1,否则返回 0。

  • 使用 std::map::find 检查 map 是否包含键

它检查映射中是否存在具有给定键“k”的任何元素,如果存在则返回其迭代器,否则返回映射的结尾。

有关更多详细信息和示例,请参阅以下链接(易于理解的说明)。

信用: https ://thispointer.com/how-check-if-a-given-key-exists-in-a-map-c/

原文由 Safin Ghoghabori 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题