Я хочу создать карту, используя std::array<int, 3>
в качестве ключа. Проблема в том, что я хочу считать равными массивы, которые являются перестановками друг друга. [0,1,2] равно [1,0,2] в моем контексте. Достаточно ли просто создать функтор компаратора для std :: unordered_map или мне нужно также предоставить собственный хеш, который дает одинаковое значение ha sh для двух значений, которые должны быть одинаковыми?
using Triangle = std::array<int, 3>;
// Do I really need this?
struct STriangleHash {
std::size_t operator()(const Triangle &a)
{
std::size_t res = 0;
boost::hash_combine(res, a[0]);
boost::hash_combine(res, a[1]);
boost::hash_combine(res, a[2]);
return res;
}
};
struct STriangleComparator {
bool operator()(const Triangle &a, const Triangle &b)
{
return std::is_permutation(std::begin(a), std::end(a), std::begin(b), std::end(b));
}
};
std::unordered_map<STriangle, int, STriangleHash, STriangleComparator> tetraTriangles;