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]=1
    

    Was im Grunde genommen auch logisch ist, denn
    Hash[Zahl] gibt dir eine Variable vom Typ map <string, float> zurück, also gibt (Hash[Zahl])[String] einen float . 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]) :S

    if( 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


Anmelden zum Antworten