Кажется, что С++ не имеет хеш-функции для строк в стандартной библиотеке. Это правда?
Что такое рабочий пример использования строки в качестве ключа в unordered_map, который будет работать с любым компилятором С++?
Кажется, что С++ не имеет хеш-функции для строк в стандартной библиотеке. Это правда?
Что такое рабочий пример использования строки в качестве ключа в unordered_map, который будет работать с любым компилятором С++?
С++ STL предоставляет шаблон специализации std::hash
для различных классов строк. Вы можете просто указать std::string
как тип ключа для std::unordered_map
:
#include <string>
#include <unordered_map>
int main()
{
std::unordered_map<std::string, int> map;
map["string"] = 10;
return 0;
}
Я столкнулся с этим сегодня (на самом деле с wstring
, а не string
, но это та же самая сделка): использование wstring
в качестве ключа в unordered_map
генерирует ошибку о том, что никакая хеш-функция не доступна для этого тип.
Решение для меня заключалось в том, чтобы добавить:
#include <string>
Верьте или нет, без включения у меня все еще был доступный тип wstring, но, по-видимому, НЕ вспомогательные функции, такие как хеш. Просто добавив добавление выше, зафиксируйте его.
Собственно, есть std::hash<std::string>
Но вот как вы можете использовать другую хэш-функцию:
struct StringHasher {
size_t operator()(const std::string& t) const {
//calculate hash here.
}
}
unordered_map<std::string, ValueType, StringHasher>
Если у вас есть CustomType
, и вы хотите подключиться к инфраструктуре STL, это то, что вы могли бы сделать.
namespace std
{
//namespace tr1
//{
// Specializations for unordered containers
template <>
struct hash<CustomType> : public unary_function<CustomType, size_t>
{
size_t operator()(const CustomType& value) const
{
return 0;
}
};
//} // namespace tr1
template <>
struct equal_to<CustomType> : public unary_function<CustomType, bool>
{
bool operator()(const CustomType& x, const CustomType& y) const
{
return false;
}
};
} // namespace std
Если вы хотите создать say a std::unordered_map<CustomType>
, STL найдет функции hash
и equal_to
без необходимости делать что-либо еще с шаблоном. Вот как мне нравится писать свой собственный сопоставитель сравнений, который поддерживает неупорядоченные структуры данных.
В моем случае это было действительно отвлечение.
У меня был тип X, для которого я реализовал хэширование для const & X используется где-то с
std::unordered_map<const X, int> m_map;
Затем мне захотелось иметь другую карту, ключ которой имеет тип X
и сделал:
std::unordered_map<X, int> map_x;
Обратите внимание на LACK of const
во втором случае.