unorder_map <float, short> Почему это работает? - PullRequest
1 голос
/ 13 октября 2011

Я использую unordered_map> float, unsigned short> для реализации хеш-таблицы в C ++.

Я знаю, что использование float в качестве ключей хеш-таблицы - это ПЛОХАЯ идея в большинстве случаев, потому что сравнение ихподвержен ошибкамТем не менее, в этих условиях я читаю значения с плавающей точкой из больших файлов, и их точность известна и постоянна.

Однако я хотел бы узнать подробности того, как unordered_map хэширует мои значения с плавающей точкой, чтобы оценить частоту столкновений.,Я не переопределяю реализацию хэша по умолчанию, когда создаю неупорядоченную карту.Согласно документации, хэш-функцией по умолчанию является std :: hash> Key>.Что в моем случае является std :: hash> float>.Однако, когда я просматриваю документацию по std :: hash, она определяется только для определенных «аргументов шаблона типа char *, const char *, crope, wrope и встроенных целочисленных типов».

Кто-нибудь знает, какая функция вызывается для хеширования значений, когда я добавляю их в unordered_map?

unordered_map - http://msdn.microsoft.com/en-us/library/bb982522.aspx

std :: hash - http://www.sgi.com/tech/stl/hash.html#1

1 Ответ

1 голос
/ 13 октября 2011

Согласно стандарту C ++ 11, float поддерживается и для std::hash.Фактическая хеш-функция зависит от реализации, поэтому даже если вы можете определить частоту коллизий для вашего текущего компилятора, более новая версия или другой компилятор могут реализовать другую хеш-функцию.Вот полный список std::hash специализаций:

template <> struct hash<bool>;
template <> struct hash<char>;
template <> struct hash<signed char>;
template <> struct hash<unsigned char>;
template <> struct hash<char16_t>;
template <> struct hash<char32_t>;
template <> struct hash<wchar_t>;
template <> struct hash<short>;
template <> struct hash<unsigned short>;
template <> struct hash<int>;
template <> struct hash<unsigned int>;
template <> struct hash<long>;
template <> struct hash<unsigned long>;
template <> struct hash<long long>;
template <> struct hash<unsigned long long>;
template <> struct hash<float>;
template <> struct hash<double>;
template <> struct hash<long double>;
template <class T> struct hash<T*>;
...