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

时间:2015-05-24 03:06:25

标签: c++ dictionary set unordered-map unordered-set

std::set<>std::map<>都可以使用std::pair作为关键字,但为什么不能std::unordered_set<>std::unordered_map<>

例如:

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

不编译。

2 个答案:

答案 0 :(得分:16)

unordered_*容器需要哈希函数。默认情况下,他们使用std::hash,但标准库中提供的std::hash没有std::pair<T1,T2>专门化。另一方面,有序容器依赖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));

答案 1 :(得分:0)

您需要为pair提供哈希函数。