我希望能够使用std::pair
作为 unordered_container 中的键。我知道我可以通过以下方式做到这一点:
template<typename T>
void
hash_combine(std::size_t &seed, T const &key) {
std::hash<T> hasher;
seed ^= hasher(key) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
namespace std {
template<typename T1, typename T2>
struct hash<std::pair<T1, T2>> {
std::size_t operator()(std::pair<T1, T2> const &p) const {
std::size_t seed(0);
::hash_combine(seed, p.first);
::hash_combine(seed, p.second);
return seed;
}
};
}
但是,我希望散列忽略中元素的顺序std::pair
(即返回相同的种子std::pair<A, B>
and std::pair<B, A>)
.
我认为实现此目的的一种方法是在创建我的std::pair<A, B>
(即某种习俗std::make_pair
)。
但这太限制了,因为对象A, B
可能没有订单。
Q:
是否有一个标准的方法来散列std::pair
,这样元素的顺序被忽略,并且返回相同的种子std::pair<A, B>
and std::pair<B, A>
?