Intelligenere Lösung gesucht



  • Hallo,

    ich habe zwei klassen die auf unterschiedliche ids zurückgreifen
    die ich nicht verändern kann aber nutzen muss.

    Im moment transformiere ich sie so:

    ...
    else if (pid == ID_SHOW_INT)  return setup::id_int;
    else if (pid == ID_SHOW_PAN)  return setup::id_pan;
    else if (pid == ID_SHOW_PTG)  return setup::id_ptg;
    ...
    // in die andere richtung
    else if (pid == setup::id_int) return ID_SHOW_INT;
    else if (pid == setup::id_pan) return ID_SHOW_PAN;
    else if (pid == setup::id_ptg) return ID_SHOW_PTG;
    

    Gibt es dafür eine intelligentere Lösung?



  • LUT? Switch-case?



  • switch

    bzw. eben eine multimap bzw 2 maps.

    aber nein, ich würde dafür ein simples switch nehmen (spart gegenüber dem if viel Schreibarbeit)



  • Je nach Umfang würde ich eine eigene Klasse bauen:

    #include <map>
    
    class IDConverter
    {
       std::map<int,int>   PID2Setup;
       std::map<int,int>   Setup2PID;
    
    public:
       void insert( int PID, int Setup )
       {
          PID2Setup[PID] = Setup;
          Setup2PIDSetup] = PID;
       }
    
       int PID( int Setup ) const
       {
          // ggf. Vorhandensein prüfen
          return Setup2PID[Setup];
       }
    
       int Setup( int PID ) const
       {
          // ggf. Vorhandensein prüfen
          return PID2Setup[PID];
       }
    }
    

    Möglicherweise bietet boost::multimap da eine bessere Lösung, die habe ich allerdings noch nicht eingesetzt und kann daher wenig dazu sagen.



  • Kleiner Flüchtigkeitsfehler: operator[] funzt auf const maps nicht.



  • krümelkacker schrieb:

    Kleiner Flüchtigkeitsfehler: operator[] funzt auf const maps nicht.

    Jau, das ist wohl so. Iteratoren und find() waren mir für die drei Zeilen zuviel Schreibarbeit 😉



  • at() sollte es tun



  • transorm_ schrieb:

    ...
    else if (pid == ID_SHOW_INT)  return setup::id_int;
    else if (pid == ID_SHOW_PAN)  return setup::id_pan;
    else if (pid == ID_SHOW_PTG)  return setup::id_ptg;
    

    Gibt es dafür eine intelligentere Lösung?

    Stehen diese ID's für Werte ab 0 aufwärts? Dann löst ein gewöhnliches C-Array
    das Problem effizienter als Switch oder Map.

    hth



  • constX schrieb:

    transorm_ schrieb:

    ...
    else if (pid == ID_SHOW_INT)  return setup::id_int;
    else if (pid == ID_SHOW_PAN)  return setup::id_pan;
    else if (pid == ID_SHOW_PTG)  return setup::id_ptg;
    

    Gibt es dafür eine intelligentere Lösung?

    Stehen diese ID's für Werte ab 0 aufwärts? Dann löst ein gewöhnliches C-Array
    das Problem effizienter als Switch oder Map.

    hth

    Danke erst einmal an alle Ideen.
    Die ids beginnen nicht mit Null haben keine Reihenfolge.
    Sind gewöhnliche unsigned int Werte



  • Mr X schrieb:

    at() sollte es tun

    Auch wenn der Thread jetzt schon zwei Tage alt ist, aber std::map hat kein at().


Anmelden zum Antworten