Что вам нужно сделать, так это определить соответствующий хеш для ключей типа std::unordered_set
(поскольку operator==
уже уже определен для этого ключа, вам не нужно будет также предоставлять EqualKey
для параметра std::unordered_set
.
Один простой (хотя и неэффективный) вариант - это хеш на общую сумму всех элементов набора. Это будет выглядеть примерно так:
template
struct hash_on_sum
: private std::hash
{
typedef T::element_type count_type;
typedef std::hash base;
std::size_t operator()(T const&obj) const
{
return base::operator()(std::accumulate(obj.begin(),obj.end(),count_type()));
}
};
typedef std::unordered_set inner_type;
typedef std::unordered_set> set_of_unique_sets;
Однако, хотя это просто, это не хорошо, поскольку это не гарантирует следующее требование. Для двух разных параметров k1 и k2, которые не равны, вероятность того, что std::hash
должна быть очень малой, приближается к 1.0/std::numeric_limits
.