Нужна ли std :: string хеш-функция при использовании с unordered_sets? - PullRequest
0 голосов
/ 16 марта 2012

Я использую неупорядоченный набор std :: strings.Каков рекомендуемый способ указать для него хеш-функцию?В настоящее время он использует по умолчанию.Нужно ли явно указать один, который мог бы работать лучше?

Ответы [ 4 ]

1 голос
/ 16 марта 2012

Стандартная специализация для std::string, вероятно, достаточно хороша (возможно, даже чрезвычайно хороша) для строк в целом.Но если вы работаете со строкой очень определенного формата, вы, вероятно, могли бы найти или разработать лучший алгоритм для вашего конкретного случая.

0 голосов
/ 16 марта 2012

Я до сих пор не понял, как добавить небольшой комментарий к ответу ... Я бы предпочел опубликовать его под ответом Майкла Барра.В любом случае, c ++ 11 имеет std::hash<string> как часть библиотеки. Здесь вы можете просмотреть все поддерживаемые хеш-функции.

0 голосов
/ 16 марта 2012

Вы можете проверить вики , где вы можете видеть, что для указания хеш-функции вы должны написать что-то вроде:

 std::unordered_map<X,int,hash_X> my_map;

где hash_X - определение хеш-функции.

Для полноты я включаю код определения, найденный в wiki

struct X{int i,j,k;};

struct hash_X{
  size_t operator()(const X &x){
    return hash<int>()(x.i) ^ hash<int>()(x.j) ^ hash<int>()(x.k);
  }
};
0 голосов
/ 16 марта 2012

Нет необходимости предоставлять свои собственные.Если вы используете VS 2010, хеш-функция для std::string находится в заголовочном файле xfunctional, включенном в <functional>, если вы хотите узнать, соответствует ли она вашим потребностям:

template<>
    class hash<_STD string>
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...