【发布时间】:2013-12-03 12:09:30
【问题描述】:
在 cppreference 上环顾四周,我发现 std::unordered_map gets efficient lookup 的功能来自“等效键”。
我认为这意味着等效键必须具有相同的哈希值。我如何才能为字符串文字提供与 std::hash<std::string> 相同的哈希值,而无需临时构造 std::string 从而使等效键的全部意义无效?
【问题讨论】:
-
乍一看,我发现有 2 个问题需要克服:1) 查找(以及其他
std::unordered_map查找函数)都采用Key const&,这将立即创建一个临时函数。 2) 字符串文字没有std::hash特化。我怀疑最好的答案是编写自己的容器,它类似于unordered_map,但允许按字符串文字进行搜索,并使用可以处理std::string(存储值)以及const char*的自定义散列函数用于查找。 -
@DaveS 那么为什么 cppreference 说从 C++14 开始的
unordered_map对find有一个“等效键”的重载?我很困惑。我认为在open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3657.htm 上介绍is_transparent的论文似乎没有为散列函数对象介绍它。另外,cppreference 谈到的Compare是什么?我觉得我错过了一些重要的东西。我只是觉得很臭,即使在 C++14 中,我仍然需要为这些简单的问题编写自己的容器:( -
是的,这个想法是您编写自己的哈希函数来涵盖所有等效类型。对于这个用例,无论如何我总是有一些“pair
”。所以不要使用 std::hash,而是你自己的,这两种类型都有一个 op()。 -
@PlasmaHH 啊,我明白了。像这样:coliru.stacked-crooked.com/a/f80fefd2c6c51c2e。不幸的是,gcc 和 clang 似乎还不支持它:/
-
我们确定
std::hash在 C++14 中获得了这种支持吗?您链接的论文仅显示在关联容器上,而不是无序容器上。尽管 cppreference 具有所有优点,但它还大量使用内部模板来减少重复。似乎map和unordered_map都在使用相同的find描述块,这解释了Compare::is_transparent在描述中的使用。
标签: c++ unordered-map c++14