hash_map
-
Hallo Leute,
ich versuche gerade die Hash_map aus der STL zu verwenden, aber leider klappt das nicht - vielleicht hat von euch schon jemand erfahrung damit.
Dieser Include alleine funktioniert, jedoch habe ich in der Msdn auch etwas vom stdext gehört?
#include <hash_map>So, das funktioniert dann nicht mehr: Der Key soll ein int sein und die Daten vom Typ der Klasse A - ist der Aufruf so richtig?
Der Compiler meldet auch immer das er hash<int> nicht kennt. Oder auch type int unexpected und noch viele viele andere Fehler.hash_map<int, KlasseA, hash<int>, eqint> hashMap;Ich würde das dringend benötigen, und hoffe auf eure Hilfe.

lg lara
-
Code
-
stdext::hash_map<int, KlasseA, hash<int>, eqint> hashMap;Wie die MSDN es schon erwähnt liegt hash_map im namespace stdext.
Gruss Spacelord
-
Danke für deine Antwort.
Leider funktioniert das auch noch nicht richtig.
Habe es jetz so:#include <hash_map> stdext::hash_map<int, KlasseA, hash<int>, eqint> hashMap;Muss man die hash_map irgendwie anders inkludieren? Bzw. kann es sein, dass es auch erst ab .NET 2003 funktioniert? In Summe kommen immer über 100 Fehler aus diesem Statement raus

-
Lara* schrieb:
ich versuche gerade die Hash_map aus der STL zu verwenden
Die STL besitzt keine hash_map. Es gibt Compilererweiterungen (von Dinkumware, SGI ...), die eine beinhaltet. Ab TR1 ist im Standard die Klasse 'unordered_map' im Namensbereich std::tr1 vorhanden vorhanden. Der Header heißt <unordered_map>. Diese Klasse verwendet intern eine Hashtabelle.
-
Lara* schrieb:
#include <hash_map> stdext::hash_map<int, KlasseA, hash<int>, eqint> hashMap;Wie sind 'hash' und 'eqint' definiert? Diese beiden sind bei mir nicht vorhanden. Versuch mal, den 'stdext::hash_compare' zu verwenden (ist standardmäßig für 'int' verwendet, muss also nicht extra angegeben werden). Dort, wo Du 'eqint' hast, sollte ein Allocator stehen. Versuch mal folgendes:
stdext::hash_map<int, KlasseA> hashMap;Das klappt bei mir (VS2005, sollte aber auch schon in früheren VS-Versionen gehen).
-
stdext::hash_map<int, KlasseA> hashMap;
funktioniert bei mir auch nicht: "stdext: is not a class or namespace name"
aber ansonsten sinds schon weniger Fehler.Laut dem http://msdn2.microsoft.com/en-us/library/6x7w9f6z.aspx ist aber die hash_map doch ein Teil der STL, hier steht auch das ab .NET 2003 stdext verwendet wird. Momentan habe ich noch Version 2002, aber ich versuche gerade die 2003 Version zu bekommen.
Folgendes funktioniert bei mir daher:
std::hash_map<int, KlasseA> hashMap;Die vorherige Funktion mit Allocator etc hatte ich von dieser Seite: http://www.wachtler.de/cpp/node85.html
Was mich jedoch immer noch beschäftigt ist, welcher HashCode wird hier intern verwendet oder kann ich einfach annehmen es wird ein solcher verwendet der zu wenig Kollisionen führt? Und noch eine Frage, ist der Aufbau der hash_map aber nicht einem Binären Baum - wie die Map - gleichzusetzten oder?
Ansonsten danke nochmal für alle Antworten

-
Lara* schrieb:
Laut dem http://msdn2.microsoft.com/en-us/library/6x7w9f6z.aspx ist aber die hash_map doch ein Teil der STL
Ja, das ist gelogen. In der MSDN steht aber auch:
Members of the <hash_map> and <hash_set> header files are not currently part of the ISO C++ standard. Therefore, these types and members have been moved from the std namespace to namespace stdext, to remain conformant with the C++ standard, in Visual C++ .NET 2003.
[Quelle: http://msdn.microsoft.com/library/en-us/vcstdlib/html/vclrfTheStdextNamespace.asp]
Momentan habe ich noch Version 2002, aber ich versuche gerade die 2003 Version zu bekommen.
Wieso 2003? Die aktuelle Version von Visual Studio ist Version 8 mit dem Produktnamen 2005. 2003 ist mittlerweile veraltet.
Die vorherige Funktion mit Allocator etc hatte ich von dieser Seite: http://www.wachtler.de/cpp/node85.html
Dass dieser Code bei Dir nicht funktioniert ist ja kein Wunder, der bezieht sich nämlich nicht auf VC sondern auf einen anderen Compiler (gcc).
Was mich jedoch immer noch beschäftigt ist, welcher HashCode wird hier intern verwendet
Gute Frage. Es liegt die Funktion 'hash_comp' zugrunde, da müsste man sich den Quellcode ansehen. Aber Du kannst davon ausgehen, dass diese Funktion für POD gut spezialisiert wurde, d.h. sie wird die Kollisionen gut minimieren.
Und noch eine Frage, ist der Aufbau der hash_map aber nicht einem Binären Baum - wie die Map - gleichzusetzten oder?
Äh natürlich nicht, sonst wäre es keine hash_map.
-
ok, jetzt ist alles klar. Nur zur vollständigkeit ich habe noch Version 7.0 2002.
Was ich noch gerade entdeckt habe gibt es anscheinend keine fertigen Funktionen auf die hash_map, siehe http://msdn2.microsoft.com/en-us/library/e5ed25x6.aspx
ich suche zb die Funktion wie bei einem Vektor hashMap.clear() - wie kann ich zb eine hashMap im destruktor löschen?
-
Lara** schrieb:
Was ich noch gerade entdeckt habe gibt es anscheinend keine fertigen Funktionen auf die hash_map, siehe http://msdn2.microsoft.com/en-us/library/e5ed25x6.aspx
Falsche Seite. Du suchst http://msdn2.microsoft.com/en-us/library/h80zf4bx.aspx.
ich suche zb die Funktion wie bei einem Vektor hashMap.clear() - wie kann ich zb eine hashMap im destruktor löschen?
Genauso: mit 'clear'.
-
Lara! Du liest in der MSDN das es hash_map erst ab MSVC7.1 gibt, und wunderst dich trotzdem, wo du weißt das du nur MSVC7 hast?

-
Artchi schrieb:
Lara! Du liest in der MSDN das es hash_map erst ab MSVC7.1 gibt, und wunderst dich trotzdem, wo du weißt das du nur MSVC7 hast?

Nein, die gab es schon vorher ... nur wurde sie ab v7.1 in einen anderen Namensbereich gepackt. Übrigens steht auf der Dinkumware-Doku-Seite nochmal was anderes, was mich sehr wundert, weil der Copyright-Notiz nach zu urteilen die Datei <hash_map> von MS nicht geändert wurde. Ich kann dem nur entnehmen, dass die Angaben bei Dinkumware nicht aktuell sind.
Übrigens, ich sehe gerade, dass mein Link kaputt ist. Richtig wäre: