Dynamische std::map, auch static möglich?



  • Hallo,

    ich bin relativ neu und kämpfe gerade eine statische dynamische map anzulegen.
    Ich glaube ich brauche eine statische map weil ich in der map paare haben will die für alle klasseninstanzen 1mal getrackt werden. Zu einem schlüssle möchte ich eine double-wert aufakkumulieren der für jede "speicherstelle" der map ein anderer ist. Außerdem soll die map wachsen können was, wie ich vermute über eine static map möglich wird?

    Ich habe ein Minimalbeispiel bei dem ich nicht weiterkomme und das noch nicht kompiliert Über Hilfe würde ich mich freuen:

    #include <iostream>
    #include <stdio.h>
    #include <map>
    
    typedef std::map<std::string,double> MAP;
    typedef MAP::iterator IT_MAP;
    
    class A{
            public:
                    A() {  }
    
            static MAP* mymap;
    
            void add_acc_timers(std::string key, double add_ab) {
              IT_MAP it = mymap.find(key);
              it->second += add_ab;
            }
            void print_acc_timers() {       
              IT_MAP it;
              for(it = mymap.begin(); it != mymap.end(); it++)
                std::cout << it->first << ": " << it->second << std::endl;
            }
            // Probleme hier
            void initialize_mymap()
            {
                    mymap = new MAP*
            }
    };
    
    // Probleme hier
    MAP A::mymap = initialize_mymap();
    
    int main(int argc, char** argv)
    {
            MAP ti_map;
            MAP_IT it;
            ti_map.insert(std::pair<std::string,double>("test",0.4));
            ti_map.insert(std::pair<std::string,double>("test2",-2.4));
    
            for(it = ti_map.begin(); it != ti_map.end(); it++)
                    std::cout << it->first << "=" << it->second << std::endl;
    
            it = ti_map.find("test2");
            it->second = 99.9;
    
            for(it = ti_map.begin(); it != ti_map.end(); it++)
                std::cout << it->first << "=" << it->second << std::endl;
    
            return 0;
    }
    


  • Das Minimalbeispiel ist kaputt. Zeilen 15 und 20 benutzen . statt ->

    Zeile 26 ist syntaktisch unvollständig. Änder es in mymap = new MAP();

    Was soll Zeile 30 machen? ein void zuweisen? Weg damit!

    MAP_IT vs IT_MAP, wie nu?

    Wenn du das ausbesserst, ist das Minimalbeispiel kompilierbar. Was genau willst du dann dazu wissen?



  • bitte auch meinen text lesen. ich habe geschrieben dass das minimalbeispiel kaputt ist. passt meine idee zu meiner vorstellung (siehe text) ?



  • Wenn das alles ist was du willst, brauchst du keine class, keine Pointer, kein static usw.
    Was static hierbei bringen soll, ist mir sowieso ein Rätsel.
    Du solltest besser den subscript operator benutzen, und statt find besser (implizit) den default value.

    http://ideone.com/CLzqUT

    typedef std::map<std::string,double> Map;
    typedef Map::iterator Mapit;
    
    int main()
    {
        Map m;
        Mapit i;
    
        m["test"]=0.4;
        m["test2"]=-2.4;
    
        for(i = m.begin(); i != m.end(); ++i)
        std::cout << i->first << "=" << i->second << '\n';
    
        m["test2"]=99.9;
    
        for(i = m.begin(); i != m.end(); ++i)
        std::cout << i->first << "=" << i->second << '\n';
    
        m["test2"]+=99.9;
    
        for(i = m.begin(); i != m.end(); ++i)
        std::cout << i->first << "=" << i->second << '\n';
    
        m["test3"]+=12.34; // default value 0.0 (für double)
    
        for(i = m.begin(); i != m.end(); ++i)
        std::cout << i->first << "=" << i->second << '\n';
    }
    


  • Wozu legst Du die map überhaupt dynamisch an? Besser ist, sie einfach statisch zu definieren:

    #include <iostream>
    #include <map>
    
    typedef std::map<std::string,double> MAP;
    typedef MAP::iterator IT_MAP;
    
    class A{
            public:
                    A() {  }
    
            static MAP mymap;
    ...
    };
    
    MAP A::mymap;
    

    Dann brauchst Du keine Initialisierungsmethode.

    Und noch wietere Hinweise:

    <stdio.h> brauchst Du nicht, also weg damit.

    void add_acc_timers(std::string key, double add_ab) {
              IT_MAP it = mymap.find(key);
              it->second += add_ab;
            }
    

    Die Methode ist kauputt. Was ist wenn key nicht gefunden wird? Dann stürzt das Programm ab. Und überhaupt, kannst Du die Methode statisch machen, da keine Klasseninstanz benötigt wird. Eigentlich kannst Du hier im Beispiel die komplette Klasse einfach weg lassen. Aber das mag an der Vereinfachung des Beispiels liegen.

    Das gleiche Iteratorproblem tritt dann nochmal in main in Zeile 43/44 auf.

    Und wenn Du hier Fragen stellst, dann solltest Du ein compilierbares Beispiel zeigen wenn es nicht direkt um die Probleme bei compilieren geht. So viel Mühe solltest Du Dir geben. Du erwartest ja auch, dass wir uns auch Mühe geben.

    Ausserdem ein Kommentar wie "Probleme hier" ist unvollständig. Welche Art von Problemen? Wenn Du Lösungen haben willst, dann verrate uns doch das Problem.


Anmelden zum Antworten