Мне часто нужен контейнер, в котором хэш связан с произвольным объектом (теоретически возможны коллизии, если два разных объекта имеют одинаковый хэш).
В C ++ 98 я бы использовал template<class Key, class T> class std::map
, используя Key
в качестве хеша, вычисленного на T
:
struct object;
typedef std::string object_hash;
object_hash compute_hash(const object& obj);
std::map<object_hash, object> hash_map;
object_hash insert_or_assign(const object& obj)
{
object_hash hash = compute_hash(obj);
hash_map[hash] = obj;
return hash;
}
std::pair<bool, object> get_at(const object_hash& hash)
{
std::map<object_hash, object>::iterator iter = hash_map.find(hash);
if( iter == hash_map.end() )
return std::pair<bool, object>(false, object());
else
return std::pair<bool, object>(true, iter->second);
}
Но начиная с C ++ 11 мы хэшировали контейнеры, поэтому я ожидал что-то вроде:
template<class T, class Key = std::hash<T>> class std::hashed_map
с требованием предоставить пользовательский std::hash
для типа T
, но вместо этого у нас есть
template<class Key, class T, class Hash = std::hash<Key>> class unordered_map
, который не применим к моему сценарию, где ключом является сам хэш, и нет никакой другой концепции "ключа", связанной с произвольным объектом.
Похоже на то, что я ожидал:
template<class Key, class Hash = std::hash<Key>> class unordered_set
но нет функций поиска на основе хэша.
В современном C ++ есть встроенный контейнер, который использует хэши и имеет интерфейсы поиска на основе этих хэшей?