gpt4 book ai didi

c++ - 如何 std::hash 一个无序的 std::pair

转载 作者:可可西里 更新时间:2023-11-01 18:18:31 25 4
gpt4 key购买 nike

我希望能够使用 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>std::pair<B, A>) 返回相同的种子。

我认为实现此目的的一种方法是在创建我的 std::pair<A, B> 时应用某种排序。 (即某种自定义 std::make_pair )。但这限制太多,因为对象 A, B可能没有订单。

问:

是否有一种标准的方法来散列 std::pair ,这样元素的顺序将被忽略,并且为 std::pair<A, B> 返回相同的种子和 std::pair<B, A>

最佳答案

不要排序对,排序散列:

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 seed1(0);
::hash_combine(seed1, p.first);
::hash_combine(seed1, p.second);

std::size_t seed2(0);
::hash_combine(seed2, p.second);
::hash_combine(seed2, p.first);

return std::min(seed1, seed2);
}
};
}

[Live example]

关于c++ - 如何 std::hash 一个无序的 std::pair,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28367913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com