Hashwert berechnen
-
Hi,
Ich habe verschiedene Objekte, die alle eine ID zwischen 1 und 1000 haben. Manche Objekte haben auch mehrere IDs; Nun moechte ich alle Objekte mit gleichen IDs in eine Map (map<int, vector<Object>>) stecken, z.B:
map[20] = hier sind alle Objekte mit ID 20 drinnen
map[891] = hier sind alle Objekte mit ID 891 drinnen
map[??] = hier sind alle Objekte mit IDs 108 und 33 drinnen
...
Die Frage ist, wie bringe ich Objekte mit mehreren IDs in einen Mapslot. Addieren geht ja nicht, denn dann wuerden z.B. die Objekte mit der ID 100 in den selben Map Slot kommen wie Objekten die 2 IDs mit den Werten 40 und 60 haben.Wie koennte man das machen in C++?
-
Wenn ein Objekt mehrere IDs haben kann, dann ist ein einzelner int wohl nicht der geeignete Typ für die ID. Eher so etwas wie vector<int> oder set<int>. Und das wäre für reines funktionieren auch schon ausreichend. Sieh das aber nur als Anregung: Da du ein bisschen besser weißt, wie das bei dir mit den IDs läuft, kannst du gewiss einen besseren Datentyp finden.
-
Was auch immer du vor hast, es hört sich verdächtig falsch ein.
map<int, vector<Object>> // wäre besser multimap<int, Object>
-
-
Multimap hört sich tatsächlich besser and.
-
Entweder packst du die Objekte mit mehreren IDs in den Bucket mit der niedrigsten ihrer IDs (als das Objekt mit 20 und 80 in den Bucket für ID 20 usw.)
-
Oder du packst in die (multi-)Map nicht die Objkete selbst, sondern Pointer darauf. Dann kannst du zu Objekten mit mehreren IDs in jedem passenden bucket einen Pointer darauf speichern.
-
Oder du machst es mit einer rekursiven Struktur:
struct Bucket : public std::pair<vector<Object>, std::map<int, Bucket> > {}; map<int, Bucket> myMap;Wenn du ein Objekt mit einer ID hast, kommt es im entsprechenden Bucket in den vector des pair. Wenns eine weitere ID hat, kommts statt dessen in die map des pair. Dort wird in der Map nach der zweiten ID der passende Bucket gesucht, dort kommt es dann in den vector oder, wenn noch mehr IDs da sind in die Map...
-
-
pumuckl schrieb:
- Oder du machst es mit einer rekursiven Struktur:
struct Bucket : public std::pair<vector<Object>, std::map<int, Bucket> > {}; map<int, Bucket> myMap;Wenn du ein Objekt mit einer ID hast, kommt es im entsprechenden Bucket in den vector des pair. Wenns eine weitere ID hat, kommts statt dessen in die map des pair. Dort wird in der Map nach der zweiten ID der passende Bucket gesucht, dort kommt es dann in den vector oder, wenn noch mehr IDs da sind in die Map...
Wegen solcher Einfälle muß ich immer ein Backup machen, bevor ich bekifft programmiere.
-
volkard schrieb:
Wegen solcher Einfälle muß ich immer ein Backup machen, bevor ich bekifft programmiere.
Jup, so ganz ernst war das auch nicht gemeint. Hätt ich auch nie gemacht, weils hieße, auf halber Strecke stehen zu bleiben. Ich hätte natürlich den Bucket als Template implementiert, mit einem Zähler für die Rekursionstiefe als Templateargument. Nachts gegen drei wäre es fertig gewesen, am nächsten Morgen um 7 hätte ich den Wecker und meine Einfälle verflucht und abends dann das Backup eingespielt
