我想使用整数数组作为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 ++提供的一些? 我的目标是将其用作哈希表,还有其他更好的选择吗?
答案 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());
}
};
}