aus mehreren Integern *eindeutige* Schlüssel erzeugen



  • Hallo

    Ich habe einige Integer (genauer C++ unsigned long) die ich irgendwie zu *einem* Key zusammenfassen muss (um ihn zusammen mit einer weiteren Eigenschaft in einer STL std::map abspeichern zu können).

    Mein Problem: Wie kann ich das erreichen ?
    Meine Lösung ist die folgende:

    stringstream sst;
    unsigned long u1, u2, u3;
    
    sst << u1 << "-" << u2 << "-" u3;
    
    // der benötigte key sieht dann so aus:
    key = sst.str();
    // key = 123456-987654-0815
    

    Aus dem generierten Schlüssel müssen die ursprünglichen Werte wieder herausgefunden werden können.

    Das schluckt allerdings ziemlich Performance (was ich auf das Nutzen von Strings als Key in der Map zurückführe).
    Hat jemand eine bessere Lösung ?

    Danke euch !



  • struct Tripel{
       unsigned long a;
       unsigned long b;
       unsigned long c;
       Tripel(){
       }
       Tripel(unsigned long _a,unsigned long, _b,unsigned long _c){
          a=_a;
          b=_b;
          c=_c;
       }
       friend bool operator==(Tripel const& a,Tripel const& b){
          return a.a==b.a&&a.b==a.b&&a.c==b.c;
       }
       friend bool operatory(Tripel const& a,Tripel const& b){
          if(a.a<b.a) return true;
          if(a.a>b.a) return false;
          if(a.b<b.b) return true;
          if(a.b>b.b) return false;
          if(a.c<b.c) return true;
          return fasle;
       }
    };
    


  • ok, ich war nicht genau genug 🙂

    zur Laufzeit meines Programms steht erst fest, wieviele unsigned long ich zusammenfügen muss. 😞

    Aber zur Not lege ich halt eine Obergrenze fest und mache es so. Danke !



  • Für vor dem Code von volkard noch ein

    #define fasle false

    ein, dann sollte es laufen. :p



  • Benja_m schrieb:

    zur Laufzeit meines Programms steht erst fest, wieviele unsigned long ich zusammenfügen muss. 😞

    Die Struktur des Tripels dürfte ja hinreichend klar sein. Schaffst Du es nach der Bauanleitung ein n-Tupel zu schreiben?

    Für die Ordnung: wenn ein n- und ein m-Tupel verglichen werden, dann ist das n-Tupel kleiner als das m-Tupel, wenn n<m. Den Rest dann analog.



  • Benja_m schrieb:

    ok, ich war nicht genau genug 🙂

    zur Laufzeit meines Programms steht erst fest, wieviele unsigned long ich zusammenfügen muss. 😞

    Aber zur Not lege ich halt eine Obergrenze fest und mache es so. Danke !

    ist die grenze sehr kleine? sagen wir´mal maximal 16 ulongs? dann mach das so.
    bei sagen wir mal immer weniger als 6 ulongs einfach so.
    bei weiniger als 16 mit nem array drinne und nem int, der die anzahl weiß, damit die vergleichsschleife bei kurzen früh abbrechen kann.
    bei noch größeren dürfte ein vector gerechtfertigt sein zusammen mit {lexicographical_compare() oder wie die heißt (kann man aber auch selber schreiben)}.
    sollen denn verschieden lange dinge verglichen werden oder innerhalb eines programmlaufs nur gleich lange?



  • Okay, danke.
    Eigentlich ist diese Lösung ja so einfach, dass man hätte drauf kommen können...

    Reine Neugier:
    Bringt das eigentlich wirklich ein mehr an Performance ?
    Ich werde es vermutlich erst heute ABend oder morgen wissen, komme vorher nicht zum ausprobieren.



  • Benja_m schrieb:

    Reine Neugier:
    Bringt das eigentlich wirklich ein mehr an Performance ?
    Ich werde es vermutlich erst heute ABend oder morgen wissen, komme vorher nicht zum ausprobieren.

    das umwandeln in einen string im dezimal-system kostet dich unglaublich viele multiplikationen. und die sind nicht wirklich billig. also beim erstellen schätze ich mindestens faktor 4. und dann beim benutzen kannste in vierersprüngen drüberhoppeln. allerdings ist deine schleife nicht klasse (nicht gerade while(*a && *a==*b)++a,++b; return *a-*b;). vierersprünge kann strcpy auch, aber hat ein wenig umständlichkeit drum, daß du bei kurzen strings wohl nicht deutlich gewinnst (repne und konsorten), bei mittellangen aber deutlich gewinnst, bei langen wieder nicht so.
    aber wie alle performance-schätzungen ist das total unglaubwürdg und nix geht über's eigene nachmessen.


Anmelden zum Antworten