无论是 std::set<>
还是 std::map<>
都可以使用 std::pair
作为键,但为什么 std::unordered_set<>
和 std::unordered_map<>
不行呢?
例如:
unordered_set<pair<int,int> > S;
S.insert(make_pair(0, 1));
无法编译。
无论是 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提供一个哈希函数。
(a,b)
和(b,a)
给出相同的值。它并不打算成为一个完美的哈希函数,只是一个简单的例子。 - Barry