Я бы отказался от заданной идеи (это пустая трата памяти и времени, чтобы сохранить два целых числа в std::set
) и пойти с парой.Затем определите
template <class A>
struct unordered_pair_hash
{
std::size_t operator()(const std::pair<A, A>& p) const {
using std::min;
using std::max;
return std::hash<A>()(min(p.first, p.second))+
17*std::hash<A>()(max(p.first, p.second));
}
};
template <class A>
struct unordered_pair_eq
{
bool operator()(const std::pair<A, A>& p1, const std::pair<A, A>& p2) const {
using std::min;
using std::max;
return min(p1.first, p1.second)==min(p2.first, p2.second) &&
max(p1.first, p1.second)==max(p2.first, p2.second);
}
};
и затем объявите карту с пользовательским хешем и равенством.
std::unordered_map<std::pair<int, int>, float, unordered_pair_hash<int>, unordered_pair_eq<int> > ...