I just znalazłem się trochę zaskoczony nie jest w stanie po prostu użyćCzy nie ma specjalizacji od std :: hash dla standardowych kontenerów?
std::unordered_set<std::array<int, 16> > test;
ponieważ nie wydaje się być std::hash
specjalizacja dla std::array
s. Dlaczego? A może po prostu go nie znalazłem? Jeśli rzeczywiście tak jest, czy następująca próba implementacji może zostać uproszczona?
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;
}
};
}
Naprawdę uważam, że powinno to być częścią standardowej biblioteki.
Naprawdę nie ma jednego, tylko 'std :: string' i znajomi mają ten przywilej. Czy byłbym naprawdę niepopularny, gdybym powiedział, że to dlatego, że wysiłki C++, aby przeciągnąć się w kierunku obecnego stanu sztuki w kategoriach standardowych struktur danych, jeszcze nie wykonały całej pracy? W rzeczywistości nie ma żadnych wymaganych specjalizacji 'hash' dla szablonów (które z kolei wymagałyby, aby ich argumenty z szablonu były nieosiągalne). Jedynymi wymaganymi specjalizacjami są wbudowane typy i cztery konkretne klasy ciągów. Podejrzewam, że tam narysowano linię. –
@Steve: Jakie 4 konkretne klasy ciągów? – fredoverflow
'string',' u16string', 'u32string',' wstring' (21,6 w C++ 11). Powiedziałbym, że 'pair' i' tuple' powinny być kolejnymi celami o najwyższym priorytecie, a następnie standardowymi kontenerami, po których następuje domyślny skrót dla dowolnego typu agregatu złożonego z hashable członków. –