hash_map



  • Abend,

    Ich brauche folgende Struktur: Ich habe Knoten (Node*) und jeder davon hat einen eindeutigen Namen (string); es kann also niemals 2 Node mit dem gleichen Namen geben. Über den Namen möchte ich dann auf den Node* zugreifen. Zusätzlich soll über einen Index auf die Node* zugegriffen werden. Also wenn ich in die Struktur 2 Node hinzufüge (zb. "Knoten1" => Node*, "EinAndererKnoten" => Node*), dann soll Index 0 den "Knoden1" liefern und Index 1 den Knoten "EinAndererKnoten".

    Ich dachte zunächst an std::map, aber ich glaube std::map sortiert und das würde ja meinen Index-Zugriff unmöglich machen, oder?

    Also habe ich mir stdext::hash_map angeschaut (ich benutze VS 2008) und einen kleinen Test geschrieben:

    stdext::hash_map<std::string, int> hm;
    
    	hm["B"] = 2;
    	hm["Z"] = 33;
    	hm["A"] = -2;
    	hm["AKEKFE"] = 4923;
    
    	stdext::hash_map<std::string, int>::iterator it = hm.begin();
    
    	for(; it != hm.end(); ++it) {
    		std::string s = it->first;
    		int j = it->second;
    	}
    

    Da gibt es nun 2 Dinge, die ich nicht verstehe:
    1. Im Debugger wird mir folgender Inhalt von hm angezeigt:

    [4](("A",-2),("B",2),("Z",33),("AKEKFE",4923))

    Wieso ist das hier sortiert? Ich dachte hash_map sortiert nicht?

    2. Wenn ich den Code ausführe, hat s in der Schleife folgende Werte:
    "B", "Z", "AKEKFE".
    Das raff ich nicht. Offenbar sind die Werte also doch unsortiert. Wieso zeigt der Debugger sie dann sortiert an? Und wieso ist "A" verschwunden?

    Ist stdext::hash_map bei meinem Problem überhaupt die richtige Struktur?

    Danke!



  • Die Ansicht im Debugger sagt doch nichts darüber aus ob die Einträge sortiert sind, schon gar nicht bei 4 Einträgen.

    Allerdings verstehe ich nicht was dir die Hashtabelle bei deinem Problem nützt, du willst doch offensichtlich zwei Zuordnungen: Index |--> Node und Name |--> Node. Das einfachste hierfür wäre zwei std::maps zu nehmen, einmal std::map<int, Node*> und einmal std::map<std::string, Node*>.



  • Wieso ist das hier sortiert? Ich dachte hash_map sortiert nicht?

    Sicher tut sie es das. Nur nicht nach einer normalen Sortierordnung.

    Schau dir mal den Artikel an, dann verstehst du es: http://en.wikipedia.org/wiki/Hash_table

    Die Lösung deines Problems ist, dass du 2 Container brauchst. Der erste speichert die Elemente in einem Vektor (für Indexzugriff), und dazu eine Map, die zu jedem string den passenden Index im vector speichert.


Anmelden zum Antworten