为什么std :: map接受std :: pair作为键,但std :: unordered_map不接受?

时间:2018-05-03 20:32:14

标签: c++ hashmap binary-search-tree unordered-map std-pair

在考虑复制之前,请理解我的问题的基础。

为什么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 questionthis 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)的键之间进行比较究竟是如何进行的呢?

1 个答案:

答案 0 :(得分:7)

balancing strategy不会散列任何内容。它使用std::map作为默认比较器。它适用于支持operator<的任何类型。

std::less使用std::unordered_map提供的哈希对其元素进行排序。

恰好std::hash提供了operator<,但没有std::hash的专业化。