如何区分地图中的 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"}))
我遇到了以下问题:
在我删除一个键并从地图上再次调用该键后,它总是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"}))