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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top