¿La mejor manera de crear un hashmap grande en tiempo de compilación (C ++)?
-
05-07-2019 - |
Pregunta
En mi aplicación, necesito cadenas de mapeo hash para un gran número de objetos estáticos. Las asignaciones permanecen fijas durante la duración de la aplicación. ¿Existe una manera fácil de generar previamente las asignaciones en tiempo de compilación en lugar de construirlas elemento por elemento cuando se inicia la aplicación?
Solución
Busque gperf , que genera un código para usted que hará un hash perfecto.
Otros consejos
Echa un vistazo a la función hash perfecta de Burtlebob. En mi experiencia es más flexible que gperf. http://burtleburtle.net/bob/hash/perfect.html
Podría escribir un generador de código simple que emita un archivo de encabezado con las asignaciones y ejecutarlo como un paso previo a la compilación en su proceso de compilación.
Estás buscando Boost. Asignar map_list_of
. También funciona para los hashmaps.
#include <boost/assign/list_of.hpp> // for 'map_list_of()'
#include <boost/assert.hpp>
#include <map>
using namespace std;
using namespace boost::assign; // bring 'map_list_of()' into scope
{
map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
BOOST_ASSERT( next.size() == 5 );
BOOST_ASSERT( next[ 1 ] == 2 );
BOOST_ASSERT( next[ 5 ] == 6 );
// or we can use 'list_of()' by specifying what type
// the list consists of
next = list_of< pair<int,int> >(6,7)(7,8)(8,9);
BOOST_ASSERT( next.size() == 3 );
BOOST_ASSERT( next[ 6 ] == 7 );
BOOST_ASSERT( next[ 8 ] == 9 );
}