为什么std :: unordered_map不能用于const std :: string键?

时间:2018-05-29 21:11:16

标签: c++ unordered-map

以下代码示例将无法编译,但可以通过删除const之前的std::string说明符作为无序映射键来进行编译。

#include <unordered_map>
#include <utility>
#include <string>
#include <iostream>

int main()
{

    int myint = 5;
    std::unordered_map<const std::string, int*> map;
    map.insert({"string", &myint});
    std::cout << *map.at("string") << std::endl;

    return 0;
}

const std::string用作密钥时,为什么在std::string被用作密钥时无法编译此代码?

1 个答案:

答案 0 :(得分:2)

默认情况下,

std::unordered_map使用std::hash作为哈希函数。它使用模板类型std::hash的密钥类型。 <string>std::hash专门设置了std::string,但由于密钥类型为const std::string,因此没有匹配的专门化和编译失败。

实际上,使用std::unordered_map<std::string, int*>可以完全满足您的需求。所有关联容器中的键已经为const,因此没有理由在const中标记模板参数。