Вам всегда нужно предоставить объект функции, сопоставляющий ключ с хэш-значением, даже если это сопоставление является идентификатором. Вы можете либо определить специализацию для std::hash<boost::uuids::uuid>
, либо выбрать std::unordered_map<K, V>
автоматически, или вы можете параметризовать неупорядоченную карту с дополнительным параметром шаблона для типа объекта функции. В дополнение к хэшу также нужна операция равенства, но по умолчанию используется operator==()
.
При этом хеш-значение не будет принимать 128-битное целое число, если ваша система не имеет встроенного 128-битного целочисленного типа. Хэш-значение должно быть std::size_t
для использования со стандартными неупорядоченными контейнерами. Полный перечень требований к std::hash<T>
специализации указан в 20.8.12 [unord.hash]:
std::hash<X>
должен быть по умолчанию конструктивно, копировать конструктивны и копировать переуступку.
std::hash<X>
необходимо заменить.
- Для типа ключа необходимо указать два вложенных типа
argument_type
и result_type
для типа хешированного значения с последним, равным std::size_t
.
- Для функции отношение
k1 == k2
=>h(k1) == h(k2)
должно быть правдой, где h
- объект функции хэширования.
Итак, вам нужно будет определить что-то вдоль линий этого:
namespace std {
template <>
struct hash<boost::uuids::uuid>
{
typedef boost::uuids::uuid argument_type;
typedef std::size_t result_type;
std::size_t operator()(boost::uuid::uuid key) const {
return transform_to_size_t(key);
}
};
}
где transform_to_size_t()
фактическое преобразование вам необходимо предоставить. };
Также см. [Boost :: uuids :: uuid как ключ в std :: unordered_map?] (Https://stackoverflow.com/q/16471051/1708801) –