Как использовать stdext :: hash_map? - PullRequest
7 голосов
/ 16 мая 2009

Я хотел бы увидеть простой пример того, как правильно переопределить stdext :: hash_compare, чтобы определить новую хеш-функцию и оператор сравнения для моего собственного пользовательского типа. Я использую Visual C ++ (2008).

Ответы [ 3 ]

8 голосов
/ 16 мая 2009

Вот как вы можете это сделать

class MyClass_Hasher {
     const size_t bucket_size = 10; // mean bucket size that the container should try not to exceed
     const size_t min_buckets = (1 << 10); // minimum number of buckets, power of 2, >0
     MyClass_Hasher() {
          // should be default-constructible
     }
     size_t operator()(const MyClass &key) {
             size_t hash_value;
             // do fancy stuff here with hash_value
             // to create the hash value. There's no specific
             // requirement on the value.
             return hash_value;
     }

     bool operator()(const MyClass &left, const MyClass &right) {
            // this should implement a total ordering on MyClass, that is
            // it should return true if "left" precedes "right" in the ordering
     }
 };

Тогда вы можете просто использовать

stdext::hash_map my_map<MyClass, MyValue, MyClass_Hasher>
1 голос
/ 16 мая 2009

Вот, пожалуйста, пример из MSDN

0 голосов
/ 16 октября 2009

Я предпочитаю использовать функцию, не являющуюся членом.

Метод, описанный в статье документации Boost Расширение boost :: hash для пользовательского типа данных , похоже, работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...