为什么我不能使用 pair 作为 unordered_set / unordered_map 的键?
Why can't I use pair as key of unordered_set / unordered_map?
std::set<>
和std::map<>
都可以用std::pair
作为key,为什么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
的专门化。另一方面,ordered 容器依赖于 std::less
(默认情况下)并且 std::pair
does 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));
std::set<>
和std::map<>
都可以用std::pair
作为key,为什么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
的专门化。另一方面,ordered 容器依赖于 std::less
(默认情况下)并且 std::pair
does 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));