Подтвердить что ты не робот

С++ Хэш-функция для строки в unordered_map

Кажется, что С++ не имеет хеш-функции для строк в стандартной библиотеке. Это правда?

Что такое рабочий пример использования строки в качестве ключа в unordered_map, который будет работать с любым компилятором С++?

4b9b3361

Ответ 1

С++ 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;
}

Ответ 2

Я столкнулся с этим сегодня (на самом деле с wstring, а не string, но это та же самая сделка): использование wstring в качестве ключа в unordered_map генерирует ошибку о том, что никакая хеш-функция не доступна для этого тип.

Решение для меня заключалось в том, чтобы добавить:

#include <string>

Верьте или нет, без включения у меня все еще был доступный тип wstring, но, по-видимому, НЕ вспомогательные функции, такие как хеш. Просто добавив добавление выше, зафиксируйте его.

Ответ 3

Собственно, есть std::hash<std::string>

Но вот как вы можете использовать другую хэш-функцию:

struct StringHasher {
    size_t operator()(const std::string& t) const {
          //calculate hash here.
    }
}

unordered_map<std::string, ValueType, StringHasher>

Ответ 4

Если у вас есть 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 без необходимости делать что-либо еще с шаблоном. Вот как мне нравится писать свой собственный сопоставитель сравнений, который поддерживает неупорядоченные структуры данных.

Ответ 5

В моем случае это было действительно отвлечение.

У меня был тип X, для которого я реализовал хэширование для const & X используется где-то с

std::unordered_map<const X, int> m_map;

Затем мне захотелось иметь другую карту, ключ которой имеет тип X и сделал:

std::unordered_map<X, int> map_x;

Обратите внимание на LACK of const во втором случае.