Problem mit meiner Map



  • hi
    danke, damit habt ihr mir sehr geholfen... hab mir schon gedacht dass das am < operator liegt, wie gesagt hab ich das von einem andren gekriegt weil ich grad mit c++ erst anfange 🙂
    da hätt ich ja auch selber drauf kommen können 😕
    [edit]
    aber muss es net eigentlich

    friend bool operator<(const Key&key1,const Key&key2) 
        { 
          if(key1.a<key2.a) return true; 
          if(key1.a>key2.a) return false; 
          if(key1.b<key2.b) return true; 
          if(key1.b>key2.b) return false; 
          if(key1.c<key2.c) return true; 
          if(key1.c>key2.c) return false; 
          return true; 
     }
    

    heissen?
    [/edit]

    grüsse Steve



  • hm... irgendwie gibt er mir jetzt gar keinen wert mehr aus, auch mit richtigem schlüssel 😞



  • Jester schrieb:

    Dann ist aber x==y nicht !(x<y || y<x) denn zwei Elemente müssen nicht zwangsläufig gleich sein, bloß weil sie sich nicht vergleichen lassen.
    Zum Beispiel die Relation "ist echter Teiler von" ist eine solche. Sicher irreflexiv, transitiv und auch antisymmetrisch. Aber 3 "ist kein echter Teiler von" 5 und umgekehrt auch nicht. Dennoch 3!=5.
    Das ist genau der Unterschied zwischen equivalence und equality. Das steck in dem weak. Auf deutsch ist also eine strikte Halbordnung gefordert.
    MfG Jester

    http://www.google.de/search?q=cache:noujbvIsFLIJ:informatik.hu-berlin.de/PI1/vorlesung/kapitel_1.doc+strikte+halbordnung&hl=de&ie=UTF-8 sagt

    Eine reflexive, transitive, antisymmetrische Relation heißt Halbordnung oder partielle Ordnung. Eine irreflexive, transitive, antisymmetrische Relation heißt strikte Halbordnung.

    isofern hab ich doch recht gut getippt.
    und http://www.sgi.com/tech/stl/StrictWeakOrdering.html sagt

    Two objects x and y are equivalent if both f(x, y) and f(y, x) are false. Note that an object is always (by the irreflexivity invariant) equivalent to itself.

    jetzt bin ich ein wenig verwirrt, was ihr sagen wollet.



  • Steve03 schrieb:

    aber muss es net eigentlich

    friend bool operator<(const Key&key1,const Key&key2) 
        { 
          if(key1.a<key2.a) return true; 
          if(key1.a>key2.a) return false; 
          if(key1.b<key2.b) return true; 
          if(key1.b>key2.b) return false; 
          if(key1.c<key2.c) return true; 
          if(key1.c>key2.c) return false; 
          return true; 
     }
    

    heissen?

    jo, sieht irgendwie richtiger aus. meins war falsch.



  • ok, bloß wieso wills noch net? 😞



  • Steve03 schrieb:

    ok, bloß wieso wills noch net? 😞

    weil deins nur "richtiger" war, aber noch nicht ganz richtig. am ende false returnen, denn bei fölliger gleichheit sollte der op< false sagen, außer er ist in wirklichkeit der op<= und es ist fasching.



  • ahhh 🙂
    thx..
    macht fun an den problemen zu tüfteln, schade dass ichs net gleich selber gemerkt hab ^^

    grüsse steve



  • Two objects x and y are equivalent if both f(x, y) and f(y, x) are false. Note that an object is always (by the irreflexivity invariant) equivalent to itself.

    Was wir sagen wollen ist folgendes. Wenn f(x,y) und f(y,x) beide falsch sind, dann sind die Werte äquivalent, nicht wie Du oben geschrieben hattest gleich. Daher äquivalent vs. equal. Für den Unterschied verweise ich nochmals auf das Beispiel "echter Teiler von". Dort ist 3 äquivalent zu 5, aber nicht 3==5.

    Mit der Definition lagst Du vollkommen richtig, aber das weak ist wichtig um zu sagen, daß es nicht unbedingt nötig ist, daß f(a,b) oder f(b,a) gilt. Sie können auch beide falsch sein.

    Hoffe das ist jetzt etwas klarer geworden.
    MfG Jester



  • eine frage noch: wenn ich alle elemente in der map löschen will, kann ich einfach

    testmap.erase(testmap.begin(),testmap.end());
    

    schreiben, oder?

    thx nochmal
    steve



  • Entweder das oder einfach

    testmap.clear();



  • ok danke!

    steve


Anmelden zum Antworten