为什么我不能使用对作为unordered_set/unordered_map的键?

Why can't I use pair as key of unordered_set / unordered_map?

本文关键字:unordered set map 的键 不能 为什么      更新时间:2023-10-16

std::set<>std::map<>都可以使用std::pair作为密钥,但std::unordered_set<>std::unordered_map<>为什么不能呢?

例如:

unordered_set<pair<int,int> > S;
S.insert(make_pair(0, 1));

不编译

unordered_*容器需要一个哈希函数。默认情况下,它们使用std::hash,但是标准库中没有为std::pair<T1,T2>提供std::hash的专门化。另一方面,有序的容器依赖于std::less(默认情况下),而std::pair 不提供 operator<。这就是为什么它很有效。

为了拥有一个具有pair的无序容器,您必须自己提供一个哈希函函数。例如:

struct SimpleHash {
    size_t operator()(const std::pair<int, int>& p) const {
        return p.first ^ p.second;
    }
};
std::unordered_set<std::pair<int, int>, SimpleHash> S;
S.insert(std::make_pair(0, 1));

您需要为pair提供一个哈希函数