在考虑复制之前,请理解我的问题的基础。
为什么C ++ std::map
接受std::pair
作为键类型,但std::unordered_map
不接受?{/ p>
第一个案例完美编译:
#include <map>
#include <utility>
using namespace std;
typedef pair<int,int> int_pair;
int main()
{
map<int_pair,int> m;
return 0;
}
第二种情况会产生大量的编译错误。从this SO question和this SO question可以清楚地看出,必须创建自定义散列函数和等价运算符。
#include <unordered_map>
#include <utility>
using namespace std;
typedef pair<int,int> int_pair;
int main()
{
unordered_map<int_pair,int> m;
return 0;
}
这里的问题不是如何编写std::unordered_map
的哈希函数。问题是,当std::map
不需要时,为什么需要一个?
我知道std::map
是二进制搜索树(BST),但是在非基本类型(int_pair)的键之间进行比较究竟是如何进行的呢?
答案 0 :(得分:7)
balancing strategy不会散列任何内容。它使用std::map
作为默认比较器。它适用于支持operator<
的任何类型。
std::less
使用std::unordered_map
提供的哈希对其元素进行排序。
恰好std::hash
提供了operator<
,但没有std::hash
的专业化。