首页 > 解决方案 > 强制转换为 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

标签: c++unordered-map

解决方案


如果请求的元素尚不存在,则调用operator[]非常量将创建具有默认值的请求元素,然后返回对该元素的引用。在填充and元素std::(unordered_)map时,您正在使用该功能。[1][2][2][2]

您的输出包含 0,因为您正在请求不存在的键,因此maps 正在插入具有默认值的那些元素,因此您最终得到一个空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;

推荐阅读