std::min, wieso mit negation?



  • Heho, gerade mal die standard minimumfunktion angeschaut und stutze ein wenig:

    template <class T> const T& min ( const T& a, const T& b ) {
      return !(b<a)?a:b;     // or: return !comp(b,a)?a:b; for the comp version
    }
    

    wieso die Negation? ist das nicht langsamer als ohne mit umgedrehten größer/kleiner zeichen?



  • ich denke das ist dafür da, das man bloß operator< für eigene Typen braucht, egal ob min oder max.



  • Das kannste doch auch durch vertauschen a und b im teil nach dem Fragezeichen erreichen(bei Entfernung des Ausrufezeichens)?!


  • Mod

    Namenloser324 schrieb:

    Das kannste doch auch durch vertauschen a und b im teil nach dem Fragezeichen erreichen(bei Entfernung des Ausrufezeichens)?!

    !(b<a) != a<b



  • SeppJ schrieb:

    Namenloser324 schrieb:

    Das kannste doch auch durch vertauschen a und b im teil nach dem Fragezeichen erreichen(bei Entfernung des Ausrufezeichens)?!

    !(b<a) != a<b

    meinte auch

    (b<a)?b:a;
    

  • Mod

    Namenloser324 schrieb:

    SeppJ schrieb:

    Namenloser324 schrieb:

    Das kannste doch auch durch vertauschen a und b im teil nach dem Fragezeichen erreichen(bei Entfernung des Ausrufezeichens)?!

    !(b<a) != a<b

    meinte auch

    (b<a)?b:a;
    

    Das liefert im Gleichheitsfall ein anderes Ergebnis.


  • Administrator

    Und vielleicht damit es noch klarer wird:
    Es geht darum, dass sich std::min zu std::max genau gedreht verhält. Wenn bei std::min(x, y) das Resultat x ist, dann soll in jedem Fall bei std::max(x, y) das Resultat y sein, egal welche Werte x und y haben.

    Grüssli


  • Mod

    Dravere schrieb:

    Und vielleicht damit es noch klarer wird:
    Es geht darum, dass sich std::min zu std::max genau gedreht verhält. Wenn bei std::min(x, y) das Resultat x ist, dann soll in jedem Fall bei std::max(x, y) das Resultat y sein, egal welche Werte x und y haben.

    Grüssli

    Das ist nicht, was der Standard vorschreibt.

    Bei Äquivalenz soll das erste Argument weitergereicht werden.


  • Administrator

    camper schrieb:

    Das ist nicht, was der Standard vorschreibt.

    Erstaunt mich etwas, aber ist tatsächlich so. Kapitel 25.4.7 Minimum and maximum, falls es jemand nachprüfen möchte.

    camper schrieb:

    Namenloser324 schrieb:

    meinte auch

    (b<a)?b:a;
    

    Das liefert im Gleichheitsfall ein anderes Ergebnis.

    (b < a) ? b : a; // (1)
    !(b < a) ? a : b; // (2)
    

    Welche Argumentation bringst du hier, dass dies nicht das gleiche Ergebnis ist? Wenn b == a , dann ist die Bedingung bei (1) false , es kommt a raus. Bei (2) ist die Bedingung true und es kommt a raus.

    Grüssli


  • Mod

    Dravere schrieb:

    camper schrieb:

    ]

    Namenloser324 schrieb:

    meinte auch

    (b<a)?b:a;
    

    Das liefert im Gleichheitsfall ein anderes Ergebnis.

    (b < a) ? b : a; // (1)
    !(b < a) ? a : b; // (2)
    

    Welche Argumentation bringst du hier, dass dies nicht das gleiche Ergebnis ist? Wenn b == a , dann ist die Bedingung bei (1) false , es kommt a raus. Bei (2) ist die Bedingung true und es kommt a raus.

    Grüssli

    Da habe ich nicht genau genug hingeschaut.
    Die Variante mit ! ist ggf. besser lesbar bzw. genügt gewissen Ästhetikansprüchen.
    So wird der bevorzugte Rückgabewert zuerst genannt.


Log in to reply