C ++ некоторые вопросы по boost :: unordered_map и boost :: hash

Я только недавно начал останавливаться на boost и его контейнерах, и я прочитал несколько статей в Интернете и в stackoverflow, что boost :: unordered_map является самым быстродействующим контейнером для больших коллекций. Итак, у меня есть этот класс State, который должен быть уникальным в контейнере (без дубликатов), и в контейнере будут миллионы, если не миллиарды состояний. Поэтому я пытался оптимизировать его для небольшого размера и как можно меньше вычислений. Раньше я использовал boost :: ptr_vector, но когда я читал в stackoverflow, вектор хорош только до тех пор, пока в нем не так много объектов. В моем случае состояние описывает сенсомоторную информацию от робота, поэтому может быть огромное количество состояний, и поэтому быстрый поиск имеет высший приоритет. Следуя документации по ускорению для unordered_map, я понимаю, что есть две вещи, которые я могу сделать, чтобы ускорить процесс: использовать hash_function и использовать оператор равенства для сравнения состояний на основе их hash_function. Итак, я реализовал частную функцию hash (), которая принимает информацию о состоянии и, используя boost :: hash_combine, создает хеш-значение std :: size_t. Оператор == в основном сравнивает хеш-значения состояния. Итак:

  • std :: size_t достаточно, чтобы покрыть миллиарды возможных хэш-функций комбинации? Чтобы избежать повторяющихся состояний, я намерен использовать их hash_values.

  • Должен ли я при создании state_map использовать в качестве ключа State * или хэш ценность ? то есть: boost :: unordered_map state_map; Или boost :: unordered_map state_map;

  • Время поиска с повышением :: unordered_map :: iterator = state_map.find () быстрее, чем через boost :: ptr_vector и сравнивая значение ключа каждого итератора?

  • Наконец, какие-нибудь советы или рекомендации по оптимизации такой неупорядоченной карты для скорости и быстрого поиска были бы весьма признательны.

РЕДАКТИРОВАТЬ: Я видел довольно много ответов, один из которых заключался в том, чтобы не использовать boost, а на C ++ 0X, другой не использовать unordered_set, но, честно говоря, я все еще хочу чтобы увидеть, как boost :: unordered_set используется с хеш-функцией. Я следил за документацией boost и реализовал ее, но до сих пор не могу понять, как использовать хэш-функцию boost с упорядоченным набором.

7
задан manlio 22 March 2014 в 15:16
поделиться