std::map



  • Hi,

    ich benutze std::map für meinen Texturmanager, läuft auch wunderbar!

    Aber erstmal etwas code (Nein das ist nicht der Manager, sondern nur Beispielcode!)

    #include <string>
    #include <map>
    #include <iostream>
    
    struct size
    {
        unsigned int width;
        unsigned int height;
    };
    
    std::map<std::string, size> my_map;
    
    size createSize (unsigned int width, unsigned int height)
    {
        size result;
        result.width = width;
        result.height = height;
    
        return (result);
    }
    
    size getSize (const std::string &name)
    {
        return (my_map[name]);
    }
    
    int main()
    {
        my_map.insert(std::make_pair("test1", createSize (1,1)));
        my_map.insert(std::make_pair("test2", createSize (1,2)));
        my_map.insert(std::make_pair("test3", createSize (1,3)));
    
        size = getSize ("test1");
    
        std::cin.get ();
    
        return 0;
    }
    

    Ich füge in die map 3 Einträge ein und hol die Werte des Eintrages mit der Funktion "getSize(name)" aus der map. aber was ist wenn ich als name etwas eingebe was nicht in der map drin ist?

    Dann passiert nichts, kein Fehler, keine Exception sondern size ist alles auf 0. Wie kann ichs erreichen das eine Exception geworfen wird wenn es einen Eintrag nicht gibt?



  • Direkte Exception gibts nicht. Wenn du jedoch mit find() zugreifst kannst du
    feststellen ob dein Eintrag vorhanden ist und wenn du möchtest kannst du dann
    in getSize() ne Exception werfen.

    mfg JJ



  • das liegt übrigens daran, dass std::maps operator[] einen gegebenenfalls nicht vorhandenen eintrag einfach mit dem standardctor erzeugt.



  • Was wäre denn eine sehr effektive lösung die schön und schnell ist?



  • Hab ich doch schon angegeben. 🙄

    Wenn du schon fragst, solltest du vielleicht auch die Antworten lesen. 😡



  • und wie frag ich das ab?

    so geht net:

    if (my_map.find (name) == 0)
        throw "bla net drine!";
    


  • Du wirst doch (hoffentlich) ein Buch, Tutorial, o.ä. haben wo die Container
    und ihre Member(-Funktionen) beschrieben sind. Andernfalls solltest du das
    dringend nachholen.

    http://www.sgi.com/tech/stl

    a.find(k)
    Returns an iterator pointing to an element whose key is the same as k, or a.end() if no such element exists.

    mfg JJ


Anmelden zum Antworten