#include #include #include template struct VectorHash { static void has_combine(size_t& seed, const T& v) { seed ^= hash{}(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); } size_t operator() (const std::vector& vec) const { size_t seed = 0; for (const T& v : vec) { has_combine(seed, v); } return seed; } }; struct TupleHash { template static void hash_combine(size_t& seed, const T& v) { seed ^= hash{}(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); } template static void hash_tuple(size_t& seed, const Tuple& t) { if constexpr (Index < tuple_size_v) { hash_combine(seed, get(t)); hash_tuple(seed, t); } } template size_t operator()(const std::tuple& t) const { size_t seed = 0; hash_tuple(seed, t); return seed; } }; int main() { std::unordered_set, VectorHash> hash_set1; std::unordered_set, TupleHash> hash_set2; return 0; }