如何区分地图中的 0 和 false?

How can I differentiate a 0 from false in a map?

我遇到了以下问题:

在我删除一个键并从地图上再次调用该键后,它总是returns 0.

那么如果某个键的值设置为0呢?

#include <iostream>
#include <map>

int main(int argc, char const *argv[]) {
  std::map<std::string, int> mymap;

  mymap["a"] = 10;
  mymap["c"] = 10;
  mymap["b"] = 20;
  mymap["zero"] = 0;

  if (mymap["zero"])
    std::cout << "yes" << '\n';
  else
    std::cout << "no" << '\n

    mymap.erase("zero");

  if (mymap["zero"])
    std::cout << "yes" << '\n';
  else
    std::cout << "no" << '\n';


  std::cout << mymap["zero"] << '\n';


  return 0;
}

不使用 if(mymap["key"]) 检查密钥是否存在,而是使用 .count():

if(mymap.count("zero")) { //key exists!
    ...

您的问题是 operator[] 将创建一个新的 key/value 对(如果不存在)。来自 cppreference:

Returns a reference to the value that is mapped to a key equivalent to key, performing an insertion if such key does not already exist.

因此,如果您尝试使用 mymap["zero"] 来判断键 "zero" 是否存在于您的地图中,它当然会——您正在创建它!

你需要的是count()功能。 count() 将 return 个元素的数量,如果不存在则不会构造对象。这将使您的 if 语句看起来像

if (mymap.count("zero"))
    // key exist here

由于您可以使用 C++17,如果您想对找到的元素执行某些操作,您可以利用它的新 if 语句语法,该语法允许您在 if 语句中声明一个变量并具有

if (auto it = mymap.find("zero"); it != mymap.end())
{
    // the element exists and it points to it
}

有几个选项。最简单的方法是使用 std::map::find 而不是 operator[] 检查元素是否存在,如果元素不存在,它总是创建一个默认值。

将另一个选项 std::optional 作为地图数据类型,然后检查是否设置了可选选项。

地图的

operator [] 将插入一个具有默认值的新条目。您应该改用 find

if (mymap.end() != mymap.find(std::string{"zero"}))