Hashtable in C ++?
-
02-07-2019 - |
Frage
Normalerweise verwende ich C ++ stdlib Karte, wenn ich einige Daten mit einer bestimmten Art von Wert (ein Schlüsselwert - zum Beispiel ein String oder ein anderes Objekt) zugeordnet speichern müssen. Die stdlib Karte Implementierung auf Bäumen basiert, die eine bessere Leistung (O (log n)) als die Standard-Array oder stdlib Vektor bereitstellt.
Meine Fragen, sind Sie von jedem C ++ wissen „Standard“ Hash-Tabelle Implementierung, die eine noch bessere Leistung (O (1)) bietet? Etwas ähnlich dem, was in der Hashtable-Klasse von der Java-API zur Verfügung.
Lösung
Wenn Sie mit C ++ 11, haben Sie Zugriff auf den <unordered_map>
und <unordered_set>
Header. Diese bieten Klassen std::unordered_map
und std::unordered_set
.
Wenn Sie mit C ++ 03 mit TR1, haben Sie Zugriff auf die Klassen std::tr1::unordered_map
und std::tr1::unordered_set
, die gleichen Header verwendet (es sei denn, Sie GCC verwenden, wobei in diesem Fall die Header sind <tr1/unordered_map>
und <tr1/unordered_set>
statt).
In allen Fällen gibt es entsprechende unordered_multimap
und unordered_multiset
Typen zu.
Andere Tipps
Wenn Sie nicht bereits unordered_map oder unordered_set, sie sind ein Teil von steigern .
Hier ist die Dokumentation für beide .
Es gibt ein hash_map Objekt wie hier viele haben erwähnt, aber es ist nicht der stl Teil. Es ist eine SGI-Erweiterung, so dass, wenn Sie etwas in der STL gesucht haben, ich glaube, Sie kein Glück.
std :: tr1 :: unordered_map, in <unordered_map>
, wenn Sie nicht tr1 haben, erhalten Auftrieb, und die Nutzung
boost :: unordered_map in <boost/unordered_map.hpp>
Visual Studio hat die Klasse stdext::hash_map
im Header <hash_map>
und gcc hat die Klasse __gnu_cxx::hash_map
im gleichen Header.
Siehe std :: hash_map von SGI.
Dies ist in der STLPort Verteilung als auch.
hash_map wird auch in GNU libstdc ++ .
Dinkumware auch unterstützt dies, was bedeutet, dass viele Implementierungen eine hash_map (ich auch Visual C ++ denken mit Dinkumware liefert).
Wenn Sie die TR1-Erweiterungen für yor Compiler haben, verwenden Sie diese. Wenn nicht, hat boost.org eine Version, die mit Ausnahme des std :: Namespace ziemlich ähnlich ist. In diesem Fall in einer using-Deklaration setzen, so können Sie wechseln :: später std.