我just發現自己有點吃驚暫時無法簡單地用一個標準容器是否沒有針對std :: hash的特化?
std::unordered_set<std::array<int, 16> > test;
,因爲似乎沒有成爲一個std::hash
專業化爲std::array
秒。這是爲什麼?或者我根本找不到它?如果確實沒有,下面的實現嘗試可以簡化嗎?
namespace std
{
template<typename T, size_t N>
struct hash<array<T, N> >
{
typedef array<T, N> argument_type;
typedef size_t result_type;
result_type operator()(const argument_type& a) const
{
hash<T> hasher;
result_type h = 0;
for (result_type i = 0; i < N; ++i)
{
h = h * 31 + hasher(a[i]);
}
return h;
}
};
}
我真的覺得這應該以某種方式成爲標準庫的一部分。
真的沒有一個,只有'std :: string'和朋友都有這個特權。如果我說這是因爲C++在標準數據結構方面拖延到現有技術水平的努力還沒有完成整個工作,我會不會真的不受歡迎?實際上,模板沒有任何必需的'hash'特性(並且這又會要求它們的模板參數可哈希)。唯一需要的特化是內置類型和四個具體的字符串類。所以我懷疑那裏畫了一條線。 –
@Steve:哪4個具體的字符串類? – fredoverflow
'string','u16string','u32string','wstring'(21.6在C++ 11中)。我認爲'pair'和'tuple'應該是次最高優先級的目標,接下來是標準容器,後面是由可哈希成員組成的任何聚合類型的默認哈希。 –