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)?!
-
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;
-
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.
-
Und vielleicht damit es noch klarer wird:
Es geht darum, dass sichstd::min
zustd::max
genau gedreht verhält. Wenn beistd::min(x, y)
das Resultatx
ist, dann soll in jedem Fall beistd::max(x, y)
das Resultaty
sein, egal welche Wertex
undy
haben.Grüssli
-
Dravere schrieb:
Und vielleicht damit es noch klarer wird:
Es geht darum, dass sichstd::min
zustd::max
genau gedreht verhält. Wenn beistd::min(x, y)
das Resultatx
ist, dann soll in jedem Fall beistd::max(x, y)
das Resultaty
sein, egal welche Wertex
undy
haben.Grüssli
Das ist nicht, was der Standard vorschreibt.
Bei Äquivalenz soll das erste Argument weitergereicht werden.
-
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 kommta
raus. Bei (2) ist die Bedingungtrue
und es kommta
raus.Grüssli
-
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 kommta
raus. Bei (2) ist die Bedingungtrue
und es kommta
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.