如何使用整数数组作为unordered_map的键

时间:2012-09-05 10:00:11

标签: c++ hashtable unordered-map

我想使用整数数组作为unordered_map的键。基本思想是我有许多不同的问题状态,表示为int state[16]。数组的值是0到15之间的数字排列,如:

a= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; 
b= { 14, 1, 9, 6, 4, 8, 12, 5, 7, 2, 3, 0, 10, 11, 13, 15}; ...

这些将是unordered_map中的键(值将是一个包含其他内容的类)。我怎样才能做到这一点?我是否需要实现一个新的哈希函数来比较值,或者我可以使用C ++提供的一些? 我的目标是将其用作哈希表,还有其他更好的选择吗?

2 个答案:

答案 0 :(得分:3)

16!大约是2 * 10 ^ 13,因此您可以将排列的序数存储在64位整数中,并将其用作映射键,而无需存储或散列排列。

请参阅http://en.wikipedia.org/wiki/Permutation#Numbering_permutations,了解0 ... N-1和数字0 ... N的排列之间的自然双射! - 1。

或者,您可以使用std::map;排列将有效地按字典顺序进行比较。

第三种选择是使用std::string作为关键字,因为您的值很容易适合char; std::hash专门用于std::string

答案 1 :(得分:0)

您可以使用Boost中的hash_range

namespace std
{
    template <typename T, typename A>
    struct hash<vector<T, A>>
    {
        size_t operator()(vector<T, A> const & v) const
        {
            return boost::range_hash(v.cbegin(), v.cend());
        }
    };
}