Switch&'Case - case mit Woerter?



  • Moin moin, ich wollte Fragen ob es nicht Mittel und Wege gibt, über switch&'Case auch Wörter abzufragen (in etwa so wie hier:)

    case "work":
                cout << "Hell, it works!\n" << endl ;
            break ;
    

    Gibt es ne möglichkeit das man auch Wörter vergleicht oder funzt es nur mit Zahlen? Das es mit "if" möglich ist, weiss ich, aber ich will wissen obs auch irgendwie mit Switch&'Case funktioniert 🙂 😕

    mfg koen



  • nur mit Ganzzahlen, enums, pointern.



  • Du kannst dir ne Map zu Hilfe nehmen:

    #include <map>
    #include <string>
    
    map<string, int> str_to_int_mapping;
    str_to_int["work"] = 0;
    str_to_int["home"] = 1;
    ...
    switch(str_to_int("work"))
    

    Enums sind dann allerdings einfacher.



  • Michael E. schrieb:

    Du kannst dir ne Map zu Hilfe nehmen:

    #include <map>
    #include <string>
    
    map<string, int> str_to_int_mapping;
    str_to_int["work"] = 0;
    str_to_int["home"] = 1;
    ...
    switch(str_to_int("work"))
    

    Enums sind dann allerdings einfacher.

    eingebaut:

    #include <iostream>
    #include <map>
    #include <string>
    
    using namespace std ;
    
    int main()
    {
    
    map<string, int> str_to_int_mapping;
    str_to_int["work"] = 0;
    str_to_int["home"] = 1;
    
    switch(str_to_int("work"))
    {
            case "work":
                cout << "Hell, it works!\n" << endl ;
            break ;
    
            default:
                cout << "Just a smal problem :)\n" << endl ;
    }
    
    system("pause");
    
    }
    

    Fehlermeldung:

    error: 'str_to_int' was not declared in this scope

    Enums? Ich werd mich jetz drüber Informationen, aber was ist das (grob erklärt).



  • Ups, achja Fehler war Zeile 12 ^^



  • Änder str_to_int zu str_to_int_mapping . Außerdem müssen zu den case s dann natürlich die Zahlen und nicht die Zeichenketten.



  • Koen schrieb:

    eingebaut

    Und dies ganz falsch.

    Nochmal: In switch/case können nur ganzzahlige Werte verwendet werden.

    Daher muss man entweder mittels einer std::map eine Konvertierung in einen Zahlenwert simulieren (Dann musst du aber auch diesen Zahlenwert, nicht den Text als Case-Marke verwenden), oder mit Enums helfen.

    Wesentlich besser (aber für dich wohl noch etwas zu viel des Guten) wäre gleich den Mapeinträgen einen Funktionszeiger u.ä. zuzuweisen, ohne den switch zu verwenden.



  • Also ein switch-case über ne Map zu umschachteln ist doch der Overhead des Jahrhundertes. Für dynamische Verknüpfungen wäre das zwar okay, aber dann gäbe es ohnehin keinen switch mehr. Für statische einfach ein if/else-Konstrukt bauen.



  • Eisflamme schrieb:

    Für statische einfach ein if/else-Konstrukt bauen.

    Jo denk ich mir jetz auch :), statich past if/else einfach besser
    danke an alle die geantwortet haben
    mfg koen



  • Eisflamme schrieb:

    Also ein switch-case über ne Map zu umschachteln ist doch der Overhead des Jahrhundertes. Für dynamische Verknüpfungen wäre das zwar okay, aber dann gäbe es ohnehin keinen switch mehr. Für statische einfach ein if/else-Konstrukt bauen.

    Das stimmt nicht. Die Zeit zum Erstellen der Map mit n Einträgen ist vernachlässigbar. Beim Lookup über die Map werden dann O(log n) Stringvergleiche durchgeführt. Wenn du eine if-Kaskade machst, brauchst du O(n) Stringvergleiche. Also ist die Map bei hinreichend vielen Aufrufen schneller (bei weniger Aufrufen ist die Gesamtzeit wiederum vernachlässigbar). Außerdem hast du deine Stringliterale nicht überall im Code rumfliegen.



  • Hm, gute Argumente. Rein vom Codebild würd ich das aber trotzdem nicht bevorzugen.



  • Eisflamme schrieb:

    Hm, gute Argumente. Rein vom Codebild würd ich das aber trotzdem nicht bevorzugen.

    Also ich denke eher an ein Codebild wie folgendes:

    // UNGETESTET!
    #include <map>
    #include <functional>
    
    void TueA() {}
    void TueB() {}
    void TueC() {}
    void TueD() {}
    
    int main()
    {
        using namespace std;
        using namespace std::tr1;
    
        std::map<string, function<void (void)> > stringFunktionen;
        stringFunktionen["a"] = bind(TueA);
        stringFunktionen["b"] = bind(TueB);
        stringFunktionen["c"] = bind(TueC);
        stringFunktionen["d"] = bind(TueD);
    
        stringFunktionen["a"]();
    }
    

Anmelden zum Antworten