Reference: C++ Standard Library: A tutorial and reference, Second version Chapter 7.9.2: Creating and Controlling unordered Container
All solutions I found in Google use XOR to generate hashcode of pair, which is totally bad. see why-is-xor-the-default-way-to-combine-hashes .
However, the book has given us the best solution, using hash_combine, which is taken from Boost. The solution is much better than XOR when I tested it in Online Judge(Atcoder ). I organized the code as a template as follow. You can copy and paste it as much as you can. And it is convenient to change it to fit any custom struct/class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <functional> template <typename T>inline void hash_combine (std::size_t &seed, const T &val) { seed ^= std::hash <T>()(val) + 0x9e3779b9 + (seed << 6 ) + (seed >> 2 ); } template <typename T> inline void hash_val (std::size_t &seed, const T &val) { hash_combine (seed, val); } template <typename T, typename ... Types>inline void hash_val (std::size_t &seed, const T &val, const Types &... args) { hash_combine (seed, val); hash_val (seed, args...); } template <typename ... Types>inline std::size_t hash_val (const Types &... args) { std::size_t seed = 0 ; hash_val (seed, args...); return seed; } struct pair_hash { template <class T1 , class T2 > std::size_t operator () (const std::pair<T1, T2> &p) const { return hash_val (p.first, p.second); } }; #include <bits/stdc++.h> using namespace std;using ll = long long ;int main () { unordered_map<pair<ll, ll>, ll, pair_hash> slopeCount; unordered_set<pair<ll, ll>, pair_hash> seen; return 0 ; }
There is a hash implementation for Tuple. I updated the answer inStackOverflow 。Please go there if you need hash tuple.