C ++ 11: Существуют ли причины, по которым некоторые регулярные типы не должны специализировать `std :: hash`?

Под регулярным типом я имею в виду определение Степанова в Элементы программирования, в основном, что существует понятие равенства и что объекты, которые являются копиями друг друга, сравниваются равными.

Поэтому, когда у вас есть обычный тип Tи отношение равенства транзитивно (а == б && b == c => a == c), вы можете определить (нетривиальный) хеш-функция, которая согласуется с определением равенства (a == b => h (a) == h (b)). Всегда.

Но стандарт не включает много std::hash специализаций. Например. std::complex не имеет ни одного, и ни один из них не имеет контейнеров, за исключением vector<bool> а также bitset,

Поэтому мне интересно, каков принцип дизайна здесь.

Или по-другому: есть ли причины не предоставлять std::hash специализации для ваших собственных типов, при условии, что они регулярны и равенство транзитивно?

16

Решение

Когда тип имеет следующие два свойства, я не думаю, что вы должны определить std::hash:

  • Не существует эффективного способа последовательно создавать качественный хеш, который охватывает все данные, используемые для описания равенства.

  • Не существует эффективного и / или интуитивно понятного способа выбора согласованного подмножества данных для хеширования.

2

Другие решения

Предоставление специализации для собственных типов не имеет смысла, если они являются шаблонными классами,
поскольку хеш-функция (с высокой и очень высокой вероятностью) также зависит от
типы параметров шаблона, которые неизвестны.

Если нет никаких параметров шаблона, или параметры шаблона ограничены определенными типами

// provide no implementation to restrict all types
template<typename T> container;

// int is allowed
template<> container<int> {
...
}

// double is allowed
template<> container<double> {
...
}

обеспечение специализации std::hash возможно, так как реализации классов (или экземпляров шаблонных классов) известны, как и для vector<bool> вопреки complex<T>,

0

По вопросам рекламы [email protected]