【问题标题】:How can I differentiate a 0 from false in a map? [duplicate]如何区分地图中的 0 和 false? [复制]
【发布时间】:2019-03-31 13:37:09
【问题描述】:

我遇到了以下问题:

在我从地图中删除一个键并再次调用该键后,它总是返回 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;
}

【问题讨论】:

  • 但我没有存储falseif 条件是检查“零”键是否存在值。
  • 在这种情况下,您不会从地图中获得truefalse。你得到一个int,它被转换成bool

标签: c++ c++17 stdmap


【解决方案1】:

您需要的是count() 函数。 count() 将返回元素的数量,如果对象不存在,则不会构造它。这将使您的 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
}

【讨论】:

  • 领先我 3 秒!显然我不应该在最后添加...:p
  • @scohe001 哈哈。我真的很惊讶。我点击了帖子,突然间你的答案出现了。
  • count 解决方案有一个非常小的缺点,如果您将mymap 的类型更改为允许重复的关联容器,它将默默地增加复杂性,而find 不会。
  • @FrançoisAndrieux 是的。但在非多容器的情况下,我更喜欢它,因为它更少打字。不过好点。
【解决方案2】:

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

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

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

返回对映射到与 key 等效的键的值的引用,如果这样的键不存在,则执行插入。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 所以我们现在有 2 个 find 答案和 2 个 count 答案。 ))
    • 我会支持find 而不是count,因为如果您确实想检查值,它会为您提供一个有用的迭代器。在调用count 后检索值将执行两次查找而不是一次。
    • @alterigel 这就是为什么我在非多地图上总是使用 find 而从不使用 count 的原因。另一方面,在给定的示例中,OP 不使用找到的值,因此count 提供了更短的符号。
    • @SergeyA 确实如此,但看起来 OP 也刚刚开始了解 map 并且应该了解 find,并且还要熟悉结束迭代器习语
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2017-06-18
      • 2021-09-16
      • 2016-06-18
      相关资源
      最近更新 更多