Stilfrage: "a<=b&&b<c" oder "b>=c&&b<c"?
-
Dobi, dann aber x als ersten Parameter oder aber in die Mitte stellen

-
Sicher letzteres. Erstere Variante sieht man bestenfalls von Leuten, die gerade frisch von der Uni abgegangen sind.
-
@Swordfish: Oh, so wollte ich es ursprünglich auch, hab den eigentlichen Teil dann aber wegen des ganzen drumherums doch falsch gemacht. Habs gefixt.

@Th69: Das Interval habe ich vorne hingeschrieben, weil es mit currying dann einfacher ist, Spezialisierungen der Funktionen zu erzeugen:
asClosedIntervalIncludes :: Ord a => (a, a) -> a -> Bool asClosedIntervalIncludes (lower, upper) x = lower <= x && x <= upper isInClosedInterval0to10 = asClosedIntervalIncludes (0, 10)http://codepad.org/f54J4m6j
Ich seh aber natürlich ein, dass das in C++ nicht so viel bringt.
In z.B. Python gehts übrigens am schönsten, finde ich:
def isInClosedInterval(lower, upper, x): return lower <= x <= upperedit: Funktion dank häksel's berechtigter Kritik umbenannt.
-
In Haskell benennt man Funktionen so, dass sie Sinn machen, wenn man sie Infix schreibt. "x `isInClosedInterval` (0, 10)" sagt genau das, was man will, "(0, 10) `isInClosedInterval` x" ist genau falsch.
Und "isInClosedInterval0to10 = (`isInClosedInterval` (0, 10))" ist nicht viel umständlicher.
-
Dobi schrieb:
In z.B. Python gehts übrigens am schönsten, finde ich:
In Ada:
if X in 1..10 then
-
@häksel: Da hast du natürlich recht, danke für den Hinweis. Hab meine Funktion dementsprechend umbenannt, auch wenn mir deine Variante eigentlich noch besser gefällt. Meine Ausrede, dass ich nicht darauf gekommen bin, ist dass ich momentan viel in Elm schreibe, und es da keine sections gibt.

@oenone: Wird dann O(1) zu O(n)? Oder geht das auch mit nicht-integralen Typen?
-
<pre><code>boost/numeric/interval/utility.hpp</code></pre> schrieb:
template<class T, class Policies> inline bool in(const T& x, const interval<T, Policies>& y) { if (interval_lib::detail::test_input(x, y)) return false; return y.lower() <= x && x <= y.upper(); }Damit ist die Sache geklärt. Man schreibt das x in der Mitte.
-
Dobi schrieb:
@oenone: Wird dann O(1) zu O(n)? Oder geht das auch mit nicht-integralen Typen?
Ja, geht auch mit Floating Point:
if X in 0.0 .. 10.0 thenDer Compiler macht daraus einfach zwei Vergleiche, so in etwa (beim Integer Beispiel):
cmpl $0, -20(%rbp) jle .L4 cmpl $10, -20(%rbp) jg .L4
-
template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type> bool isin(T x, T l, T r) { using std::begin; using std::end; std::vector<int> v(r - l); std::iota(begin(v), end(v), l); return std::find(begin(v), end(v), x) != end(v); }
-
Edit:
return std::binary_search(begin(v), end(v), x);
-
steilguido schrieb:
Was schreibt ihr?
if (0<=x && x<=10);oder
if (x>=0 && x<=10);oder was anderes?
Praxisbeispiel wäre
'a'<=c && c<='z'vsc>='a' && c<='z', kommt aber häufig auch woanders vor.Kommt alles aufs gleiche raus, aber welche Version ist gebräuchlicher?
Ich benutze erstere. Sieht eher nach 0<=x<=10 aus, wie es in den Mathebüchern steht.
Die erste Funktion dafür, die ich kenne, heißt range(min,x,max) und wurde mit Borland3.1 ausgeliefert. In der Tat schlechter Stil, weils range(x,min,max) heißen sollte. Alternativ sorted(min,x,max).