Switch-Case
-
Hallo,
ich bin neu in der c++ Welt.
Habe daher auch eine einfache Frage.
Kann man mit einer Switch-Case-Anweisung auch Strings auswerten bzw. Prüfen um bestimmte Fälle zu unterscheiden? Bei Intergerwerten kenne ich das ja, möchte aber nun Strings prüfen. um Fälle zu unterscheiden.
-
Hallo,
Switch-Case mit Strings geht leider gar nicht. Musst Du wohl anders machen.
-
Danke für den Hinweis, nutze ich else-If-Abfragen.
Sieht zwar nicht schön aus, aber anders gehts nicht.
-
Hi,
alternativ kannst Du evtl. eine std::map anlegen. Ist elegant, aber bisweilen oversized oder unpraktisch (z.B. wenn die Aufgaben der einzelnen Zweige zu unterschiedlich oder untereinander abhängig sind).
Gruß,
Simon2.
-
Wenn du uns etwas mehr ueber das Problem erzaehlst, das du mit dem string-switch loesen willst, kann dir vielleicht auch jemand eie Alternative zeigen, die das umgehen.
Wenn die Moeglichkeiten in der switch-anweisung viele sind (oder viele werden koennen), dann wird eine if-else kaskade schnell unuebersichtlich und grausam zu warten. Die oben angesprochene Loesung mit der map koennte etwa wie folgt aussehn:
void processString(std::string const& str) { enum { Bla, Blubb, Bla2, Omfg }; //die integralen werte, in die die strings uebersetzt werden static std::map<std::string, int> smap; //einmalig angelegtes "woerterbuch" static struct S{ S(){ //der ctor des Objekts traegt die Werte ins "woerterbuch" ein smap["bla"] = Bla; smap["blubb"] = Blubb; smap["BLUBB"] = Blubb; smap["bla2"] = Bla2; smap["omfg"] = Omfg; }} s; switch(smap[str]) { case Bla: /*...*/ case Blubb: /*..*/ //... } }
-
Genau ... und manchmal geht's auch ohne anschließendes switch und man kann gleich den map-Wert weiterverwenden:
static std::map<std::string, int> offsetMap; //einmalig angelegtes "woerterbuch" static struct S{ S(){ //der ctor des Objekts traegt die Werte ins "woerterbuch" ein offsetMap["bla"] = 1; offsetMap["blubb"] = 3; offsetMap["BLUBB"] = 17; offsetMap["bla2"] = -2; offsetMap["omfg"] = 3; }} s; int i = getVal() + offsetMap[str]; // kleine Warnung: operator[]() arbeitet ein wenig unerwartet bei nicht vorhandenen Elementen !!Oder man füllt die Map mit Funktionszeigern oder .... oder ...
Gruß,
Simon2.
-
das ist selbst mir gerade sehr von nutzem...
kurz und anschaulich beschrieben, ich danke mal.hab mal ne andere frage zum switch-case. wie baue ich dort eine "else"-ähnliche anweisung ein?
habe zum beispiel:
[code]switch(nummer){ case 1: problempointer = &problem1; break; case 8: problempointer = &problem8; break; case 9: problempointer = &problem9; break; }; [/code]und möchte nun so etwas sagen wie:
"case else: cout << "\nKeine Problemlösung bekannt!"ist sicher recht einfach, find nur nichts dazu, seh wohl grad den wald vor lauter bäumen nicht.
oder bediene google und die forensuchfunktion falsch
-
Wenn ich Dich richtig verstehe, suchst Du nach 'default' (wird ausgeführt, wenn keine andere Bedingung erfüllt wurde:
switch () { case : ; break; case : ; break; default: ; }
-
Ich möche nochmal darauf hinweisen, dass die Verwendung der map mitunter einen ganz enormen Performance-Vorteil mit sich bringen kann. Noch besser wäre aber die Verwendung einer Hashtabelle (
std::tr1::unordered_map). In VB.NET und C#, wo 'switch'-Anweisungen mit Strings erlaubt sind, wandelt der Compiler lange 'switch'-Abfragen auf Strings intern automatisch in die Verwendung einer Hashtabelle um.
-
meißt reicht doch ein enum:
enum Auswahl{ OPTION1 OPTION2 FOO BAR FOOBAR BLA } //[...] Auswahl auswahl = BLA; //[...] switch(auswahl){ case OPTION1: break; case OPTION2: break; case FOO: break; case BAR: break; case FOOBAR: break; case BLA: break; } //[...]dann sieht das im Editor wie TEXT aus, Eingabeabfragen funktionieren so nicht, da sind die anderen Lösungen besser, aber alles was c++ intern ist lässt sich so realisieren.
-
... für die antwort und die weiteren hinweise zur map...
wünsche nen angenehmen start in die woche!