Итак, вы рекомендуете вообще избегать хэш-функций и значений? Уникальность необходима, быстрый поиск - это то, чего я желаю. Однако в упорядоченном состоянии, по какому ключу они получают заказ? Значение указателя?

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

Достаточно ли std :: size_t для покрытия миллиардов возможных комбинаций hash_function? Чтобы избежать дублирования состояний, я намерен использовать их hash_values.

При создании state_map я должен использовать в качестве ключа State * или значение хеша? то есть:boost::unordered_map<State*,std::size_t> state_map; Или жеboost::unordered_map<std::size_t,State*> state_map;

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

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос