2010-02-01 6 views
43

Ich weiß nicht, wie die Hash-Funktion in C++ verwenden, aber ich weiß, dass wir hash_map verwenden können. Unterstützt g ++ das, indem man einfach #include <hash_map> einfügt? Was ist ein einfaches Beispiel mit hash_map?Ich würde gerne eine Hash-Map-Beispiel in C++

+8

@BlueRaja: Ja in der Tat führt die Verwendung zu so wunderbarer Verwirrung wie Leute glauben, dass 'hash_map' tatsächlich Teil von C++ ist. Ich denke, dass dies, wie jede andere programmbezogene Frage, hier auf SO zu Hause ist, nicht wahr? Google die Nutzung von Google zu erklären, ist eine Verschwendung von ihnen und unserer Zeit. Ihre, weil sie Tausende von ungenauen und unzuverlässigen Antworten durchforsten müssen, und unsere, weil wir dann alle ihre falschen Vorstellungen und schlechten Praktiken niederreißen müssen, wenn sie hierher kommen, um später Fragen zu stellen. – jalf

+1

@jalf: Als wären die Antworten auf SO irgendwie garantiert genau und zuverlässig. –

+11

Sie werden garantiert von anderen Programmierern gesehen und gewählt, was sie wesentlich vertrauenswürdiger macht als die meisten anderen, die ein Anfänger blind auf Google finden könnte. – jalf

Antwort

50

Die aktuelle C++ Standard nicht über Hash-Karten, aber die kommenden C++ 0x-Standard der Fall ist, und diese sind bereits von g ++ in der Form von "ungeordnete Karten" unterstützt:

#include <unordered_map> 
#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    unordered_map <string, int> m; 
    m["foo"] = 42; 
    cout << m["foo"] << endl; 
} 

Um Diese Kompilierung zu erhalten, müssen Sie sagen, g ++, die Sie verwenden C++ 0x:

g++ -std=c++0x main.cpp 

Diese Karten arbeiten ziemlich viel wie std :: map tut, außer dass stattdessen eine benutzerdefinierte operator<() für Ihre eigenen Arten der Bereitstellung von , müssen Sie eine benutzerdefinierte Hash-Funktion - suitab bereitstellen Die Funktionen sind für Typen wie Integer und Strings vorgesehen.

+0

+1: Sie sollten diese Antwort bearbeiten, um TR1 zu erwähnen, obwohl ... –

+1

@Kornel Nein, sollte ich nicht. TR1 wurde nie ratifiziert - der Namespace tr1 ist nur eine Erweiterung, die ein Compiler bietet. Ich benutze es nie in meinem eigenen Code. –

+0

@Neil, sooo, eine Person, die GCC 3.4, MSVC und andere Nicht-C++ 0x Compiler verwendet, sollte TR1 nicht verwenden, aber bitte warten Sie, bis C++ 0x Bibliothekserweiterungen sofort unterstützt werden? –

9

#include <tr1/unordered_map> erhalten Sie nächsten Standard C++ unique hash container. Verbrauch:

std::tr1::unordered_map<std::string,int> my_map; 
my_map["answer"] = 42; 
printf("The answer to life and everything is: %d\n", my_map["answer"]); 
+3

C-Style-Ausgabe mit C++ - Stil-Container? Autsch! – Bill

+22

Willkommen in der realen Welt :) –

1

Der Name akzeptiert in TR1 (und der Entwurf für den nächsten Standard) ist std::unordered_map, wenn Sie also, dass zur Verfügung haben, ist es wahrscheinlich die, die Sie verwenden möchten.

Andere als die, es zu benutzen ist viel wie std::map verwendet wird, mit der Maßgabe, dass, wenn/falls Sie die Einzelteile in einem std::map durchqueren, sie kommen in der Reihenfolge von operator< angegeben, aber für einen unordered_map, der Auftrag ist im Allgemeinen bedeutungslos.

Verwandte Themen