Der beste Weg, große hashmap bei der Kompilierung (C ++) zu schaffen?
-
05-07-2019 - |
Frage
In meiner Anwendung, ich brauche einen Hash-Map-Mapping-Strings zu einer großen Anzahl von statischen Objekten. Die Zuordnungen bleiben für die Dauer der Anwendung festgelegt. Gibt es eine einfache Möglichkeit, die Zuordnungen bei der Kompilierung vorab zu erzeugen, anstatt Gebäude es Element-für-Element, wenn die Anwendung gestartet wird?
Lösung
Sehen Sie gperf , erzeugt er Code für Sie das wird perfekt Hash.
Andere Tipps
Überprüfen Sie heraus Burtlebob die perfekte Hash-Funktion. Nach meiner Erfahrung ist es flexibler als gperf. http://burtleburtle.net/bob/hash/perfect.html
Sie können einen einfachen Code-Generator schreiben, die eine Header-Datei mit den Zuordnungen emittieren, und führen Sie das als Pre-Build-Schritt in Ihrem Build-Prozess.
Sie suchen -Boost. Assign map_list_of
. Es funktioniert für Hashmaps zu.
#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 );
}