unordered_map структуры, чьи перестановки сравниваются одинаково - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу создать карту, используя 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;

...