std::map fehler ?



  • Ich schreibe gerade eine kleine Eingabekonsole, und möchte wissen ob dass was ich mache gefährlich ist?

    std::map<std::string, int> cmds;
    std::vector <std::string> designation;
    

    Nun wird in die cmds.txt eingegebn exit=1.
    Mein Programm bearbeitet es dann so:

    designation.push_back(exit);
    cmds[exit] = 1;
    

    Bei der Suche wird überprüft ob es den Befehl gibt.

    int  Commands::SearchCmd(const std::string &cmd)
    {
        if(!cmds.empty())
        {
            if(cmds[cmd]!=0)
            return cmds[cmd];
        }
        return 0;
    }
    

    Und beim Speichern der Befehle

    for(std::size_t i=0;i<designation.size();i++)
    {
       int id=0;
       id = cmds[designation[i]];
       oFile << designation[i] << "=" << id << '\n';
    }
    

    Würde es z.b auf manchen Systemen krachen wen ich ein undefinierten String in map eingebe ?



  • Also krachen dürfte das afaik nicht. Allerdings weiß ich nicht, ob es das macht, was du beabsichtigst - map<> fügt ein neues Element ein, wenn du auf diese Weise nach Einträgen suchst.



  • So besser ?

    int  Commands::SearchCmd(const std::string &cmd)
    {
        if(!cmds.empty())
        {
            for(std::size_t i=0;i<designation.size();i++)
            {
                if(designation[i]==cmd)
                {
                    return cmds[designation[i]];
                }
            }
        }
        return 0;
    }
    


  • Schau dir mal std::find() an, z.B. hier...



  • So besser ?

    Nein. Der operator[...] der std::map<..> fügt ein Element ein, falls es nicht schon existiert. Benutze die find(..) Methode der std::map<..>.



  • Wenn in beiden Containern sowieso die selben Informationen stehen, ist imho einer zu viel. Ich würde ja am ehesten find() verwenden, um zu prüfen ob der Wert vorkommt:

    int  Commands::SearchCmd(const std::string &cmd)
    {
        std::map<std::string,int>::iterator pos = cmds.find(cmd);
        if(pos!=cmds.end())
            return pos->second;
        return 0;
    }
    


  • Danke ich werde mir std::map noch mal genauer ansehen 🙂


Log in to reply