C ++ algunas preguntas sobre boost :: unordered_map & boost :: hash

Hace poco comencé a pensar en boost y sus contenedores, y leí algunos artículos en la web y en stackoverflow que un boost :: unordered_map es el contenedor de mayor rendimiento para grandes colecciones. Entonces, tengo esta clase de estado, que debe ser única en el contenedor (sin duplicados) y habrá millones, si no miles de millones de estados en el contenedor. Por lo tanto, he estado tratando de optimizarlo para un tamaño pequeño y la menor cantidad de cálculos posible. Estaba usando un boost :: ptr_vector antes, pero mientras leo en stackoverflow, un vector solo es bueno siempre que no haya tantos objetos en él. En mi caso, el estado describe la información sensoriomotora de un robot, por lo que puede haber una enorme cantidad de estados y, por lo tanto, la búsqueda rápida es de máxima prioridad. Siguiendo elboost documentation for unordered_map Me doy cuenta de que hay dos cosas que puedo hacer para acelerar las cosas: usar una función hash y usar un operador de igualdad para comparar estados en función de su función hash. Entonces, implementé una función hash () privada que toma la información del Estado y usando boost :: hash_combine, crea un valor hash std :: size_t. El operador == compara básicamente los valores hash del estado. Entonces

is std :: size_t ¿suficiente para cubrir miles de millones de posibles combinaciones de hash_function? Para evitar estados duplicados, pretendo usar sus valores hash.

Al crear un state_map, ¿debo usar como clave el Estado * o el valor hash? es decir:boost::unordered_map<State*,std::size_t> state_map; Oboost::unordered_map<std::size_t,State*> state_map;

¿Son los tiempos de búsqueda con un boost :: unordered_map :: iterator = state_map.find () más rápido que pasar por un boost :: ptr_vector y comparar el valor clave de cada iterador?

inalmente, cualquier consejo o truco sobre cómo optimizar un mapa desordenado para la velocidad y las búsquedas rápidas sería muy apreciado.

EDIT: He visto bastantes respuestas, una para no usar boost pero C ++ 0X, otra para no usar un_ororde_set, pero para ser honesto, todavía quiero ver cómo se usa boost :: unordered_set con un hash función. He seguido la documentación de boost y la he implementado, pero aún no puedo entender cómo usar la función hash de boost con el conjunto ordenado.

Respuestas a la pregunta(3)

Su respuesta a la pregunta