2016-07-24 8 views
2

Wie Objekte einer Klasse in einem unordered_set gespeichert werden. Mein Programm muss häufig prüfen, ob ein Objekt in diesem ungeordneten_Satz vorhanden ist, und wenn dies der Fall ist, dann aktualisieren Sie dieses Objekt. Ich habe online nachgeschlagen, wie unordered_set zu verwenden ist, aber in den meisten Tutorials geht es darum, es in int, String-Typen zu verwenden. Also frage ich, wie man es im Unterricht benutzt? Wie definiert man eine Hash-Funktion, um die knoten_id im folgenden Beispiel den Schlüssel des ungeordneten_satzes zu machen? Vielen Dank.wie C++ ungeordnetes_set für Klasse zu verwenden?

#include <iostream> 
#include <unordered_set> 

using namespace std; 

//how to define a hash function that makes node use node_id as key? 

struct node 
{ 
    string node_id; 
    double value; 
    node(string id, double val)::node_id(id),value(val) {} 
}; 


int main() 
{ 
    unordered_set<node> set; 
    set.insert(node("1001",100)); 
    if(set.find("1001") != set.end()) cout << "1001 found" << endl; 
} 
+0

Vielleicht hilft das? http://stackoverflow.com/questions/15869066/inserting-into-unordered-set-with-custom-hash-function – JohnB

+1

Es sieht aus wie Sie brauchen eine Karte und nicht ein Set. –

+0

Ich habe tatsächlich Karte verwendet. aber es hat gelesen, dass eine ungeordnete Menge eine O (1) -Komplexität zum Nachschlagen hat. – daydayup

Antwort

4

Sie könnten versuchen, das folgende Hash-Funktion-Objekt (es ziemlich einfach ist, so dass Sie es zu verbessern, um nicht zu viele Kollisionen mögen).

struct node_hash { 
    std::size_t operator()(const node& _node) const { 
     return std::hash<std::string>()(_node.node_id); 
    } 
} 
// ... 
std::unordered_set<node, node_hash> node_set; 

jedoch als einer der Kommentare darlegt, können Sie besser dran sein hier ein std::unordered_map<std::string, double> verwenden.

+0

Danke! Ich werde versuchen, unordered_map – daydayup

1

Sie müssen eine benutzerdefinierte Hash-Funktion implementieren (ich würde vorschlagen, die Funktion in der Boost-Bibliothek zu verwenden), um dies zu tun. C++ ermöglicht das Speichern von Zeigern auf Objekten einer Klasse mit unordered_set. Für die meisten Zwecke sollte das den Trick machen.

+0

kann ich fragen, was ist der Vorteil des Speicherns von Zeigern anstelle der Objekte? immer Wunder – daydayup

+0

Soweit Hashing geht, Zeiger sind nur Werte, die auf Erinnerungen - Speicheradressen, wenn Sie so wollen, die wie jede andere Zahl (wie int, double, etc.) Hashed sein können, weil sie selbst ähnlich sind. Im großen Bild sind Zeiger Referenzen, die beim Umgehen überflüssige Kopien vermeiden. – ucsunil

Verwandte Themen