mehrdimensionale Map als Hash, Initialisierung?
-
hi,
ich möchte eine mehrdimensionale Map erstellen, und weiß nicht genau wie ich sie auffüllen kann, bzw. darauf zugreifen .
Für meine Map mit nur einem Werte Paar <string, float> habe ich es so gemacht:if(Hash[wort]){ Hash[wort]++;} else{ Hash[wort]=1;}nun möchte ich dem aber eine weitere Kategorie hinzufügen, dass da steht: <int, string, float> Quasi der Integer wert gibt verschiedene Levels an, die dann wiederum verschiedene string, float paare haben.
Das definieren war kein Problem:typedef map<int, map <string, float>> hash ;hash Hash;Aber wie soll es weiter gehen, mein Versuch es so zumachen, funktioniert nicht, dabei ist die variable wort ein string:
if(Hash[1,wort]) Hash[1,wort]++; else Hash[1,wort,1];Ich möchte auf das erste Level zugreifen, und dann wenn das wort schon in der Hashmap drinnen ist, den key (floatwert) um 1 erhöhen, ansonsten ihm mit 1 in die Hashtabelle aufnehmen.
Geht das?lg
-
s/,1]/]=1/g
s/,/][/g
-
mit einem regulären Ausdruck?
-
Fast, dieser reguläre Ausdruck besagt, dass du
Hash[1,wort]in
Hash[1][wort]umwandeln sollst und genauso
Hash[1,wort,1]in
Hash[1][wort]=1Was im Grunde genommen auch logisch ist, denn
Hash[Zahl]gibt dir eine Variable vom Typmap <string, float>zurück, also gibt(Hash[Zahl])[String]einenfloat. Die Klammerung kann weggelassen werden.
-
also so?
if(Hash[1][wort]) {Hash[1][wort]++; else {Hash[1] [wort]=1;}hmm ich muss es ausversuchen ..
-
Du hast noch einen grundlegenden Denkfehler: Wenn du überprüfen willst, ob sich ein Element in einer map befindet, musst du find verwenden. Der []-Operator legt das Element an, wenn es nicht existiert.
-
ja aber das will ich doch oder?
es soll erst getestet werden , ob es existiert, und wenn nicht, dann leg es an.
-
Du testest aber nicht obs es existiert. Du legst es einfach so an, und zwar damit:
Hash[1][wort]
-
hmm ok
also dann so? Hash.find([1,wort]) :Sif( Hash.find([1, wort])) {Hash[1][wort]++; } else {Hash[1] [wort]=1;}ich glaub mehrdimensionale hashes mit maps sind zu kompliziert

wenn ich die map später ausgeben will, ist das ja das nächste problem
Hash::iterator pos; for(pos=Hash.begin();pos!=Hash.end(); pos++){ cout<< "Level: << pos->first << ""Wort " << pos->second << " Wert " << pos-> third << endl;}
-
oder nein
Hash[1][wort]++;wird auch wieder was neues angeöegt, anstatt den bereits vorhanden key in seinem wert zu erhöhren
-
ich hab das Programm jetzt dahin gehend geändert, dass ich einfach ein pair und ein int wert in die Map einfüge, damit ändert sich ja der Zugriff zur 'normalen' Map nicht und es bleibt überschaubar ...
also map < (int, string), float> hash;
euch herzlichen Dank

und
lg