c++ - 强制转换为 bool 是检查是否存在与键匹配的 unordered_map 值的有效方法吗?C++
问题描述
我有一个嵌套的 unordered_map 并想检查是否为一组键创建了一个值。大多数像这样的在线解决方案都建议遍历密钥以检查它们的存在。正如我在下面所做的那样,尝试访问它们并将它们转换为 bool 是否存在固有问题?测试的输出让我相信它有效。
std::unordered_map<int, std::unordered_map<int, const char*>> myMap;
myMap[1][2]="abc";
myMap[2][2]="false";
std::cout <<(bool)myMap[1][2]<< std::endl;
std::cout <<(bool)myMap[0][0]<< std::endl;
std::cout <<(bool)myMap[0][0]<< std::endl;
std::cout <<(bool)myMap[1][4]<< std::endl;
std::cout <<(bool)myMap[2][2]<< std::endl;
输出
1
0
0
0
1
解决方案
如果请求的元素尚不存在,则调用operator[]
非常量将创建具有默认值的请求元素,然后返回对该元素的引用。在填充and元素std::(unordered_)map
时,您正在使用该功能。[1][2]
[2][2]
您的输出包含 0,因为您正在请求不存在的键,因此map
s 正在插入具有默认值的那些元素,因此您最终得到一个空char*
指针,您将其类型转换为bool
. 任何非空值都输出为真/1,任何空值输出为假/0。
要简单地检查元素是否存在,您可以使用 map 的find()
orcount()
方法,或者在 C++20 中使用该contains()
方法,例如:
bool keysExist(
const std::unordered_map<int, std::unordered_map<int, const char*>> &m,
int index1, int index2)
{
auto iter = m.find(index1);
return (iter != m.end()) && (iter->find(index2) != iter->end());
// or: return (iter != m.end()) && (iter->count(index) == 1);
// or: return (iter != m.end()) && iter->contains(index2);
}
std::unordered_map<int, std::unordered_map<int, const char*>> myMap;
myMap[1][2] = "abc";
myMap[2][2] = "false";
std::cout << keysExist(myMap, 1, 2) << std::endl;
std::cout << keysExist(myMap, 0, 0) << std::endl;
std::cout << keysExist(myMap, 0, 0) << std::endl;
std::cout << keysExist(myMap, 1, 4) << std::endl;
std::cout << keysExist(myMap, 2, 2) << std::endl;
推荐阅读
- javascript - 如何使用 onMouseDown 动态更新 NavBar 变量?
- outlook-restapi - 刷新令牌的请求无效
- python - 用python读取嵌套的json数据
- c# - 无法获取此实现的 CryptoAPI 加密服务提供程序 (CSP)
- c# - 在 Visual Studio 中,为什么所有文件都自动成为我的 C# 项目的一部分?
- java - MQTT 消息到 JSONObject
- autodesk-forge - 在 Forge 查看器中更改设置面板
- jquery - 如何在没有访问头部的情况下在 css 之前预加载字体?
- azure - 资源组名称不能为空?
- soap - 使用 TLS1.2 将 SSIS 连接到在线源失败