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