2012-09-05 46 views
2

我想使用整數數組作爲unordered_map的鍵。基本思想是,我有許多不同的問題狀態,表示爲​​。數組的值是從0到15編號的置換,如:如何使用整數數組作爲unordered_map的鍵

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

你可能需要實現你自己的['std :: hash']專門化(http://en.cppreference.com/w/cpp/utility/hash)。 –

回答

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

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()); 
     } 
    }; 
} 
相關問題