C++ std Funktion für Intervalle
-
player4245 schrieb:
unskilled schrieb:
template<typename T> struct intervall { intervall(T min, T max) : min(min), max(max) {} bool ist_enthalten(T c) const { assert(min <= max && "grenzen falsch"); return c >= a && c <= b; } T min; T max; };
Die C++0x Lösung. Warum einfach wenns auch umständlich geht^^
Was hat das denn mit C++0x zu tun?
Dieses Klassen-Template ist nunmal die Abbildung des Konzepts "Intervall".
In diesem Fall ist das vielleicht ein bissel Overkill aber sonst lohnt es sich, den Dingen in Form von Funktionen oder Klassen einen verständlichen Namen zu geben. Abstraktion ist gut. Damit bekommt man auch größere Projekte besser in den Griff.kk
-
Shade Of Mine schrieb:
Die intervall Funktionmacht aber durchaus Sinn.
Dann doch lieber gleich eine ganze Klasse für Intervalle die dann auch gleich mathematische Funktionen wie Vereinigung oder Schnitt kennt. Und halt eben noch eine kleine Funktion um festzustellen, ob ein Wert im Intervall ist.
-
Gut vorstellen könnte ich mir auch eine Intervall-Containerklasse mit STL-typischem Interface, die intern nur Start, Ende und Schrittweite speichert. Die Anwendungsfälle sind bestimmt nicht omnipräsent, aber wäre sicher manchmal ganz praktisch.
-
ipsec schrieb:
Gut vorstellen könnte ich mir auch eine Intervall-Containerklasse mit STL-typischem Interface, die intern nur Start, Ende und Schrittweite speichert. Die Anwendungsfälle sind bestimmt nicht omnipräsent, aber wäre sicher manchmal ganz praktisch.
So etwaas gibt es glaube ich schon:
http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Die_STL/_Algorithmen#Intervalle.2C_Sequenzen_und_Bereiche
-
intervall schrieb:
Gibt es in der STL bereits eine Funktion ob sich eine Zahl in einem Intervall befindet?
Zum Beispiel die Zahl 5 im Intervall 1 bis 10 befindet?
bei boost gibt es so etwas
#include <iostream> #include <boost/numeric/interval.hpp> int main() { using namespace std; boost::numeric::interval< int > bereich(1,10); for( int zahl; cin >> zahl; ) cout << zahl << " liegt " << (in( zahl, bereich )? "": "nicht ") << "im Bereich [" << bereich.lower() << ";" << bereich.upper() << "]" << endl; return 0; }
-
SeppJ schrieb:
Shade Of Mine schrieb:
Die intervall Funktionmacht aber durchaus Sinn.
Dann doch lieber gleich eine ganze Klasse für Intervalle die dann auch gleich mathematische Funktionen wie Vereinigung oder Schnitt kennt. Und halt eben noch eine kleine Funktion um festzustellen, ob ein Wert im Intervall ist.
Ich sehe den Zusammenhang nicht. Eine "in_range()" Funktion habe ich selber oft. Wie man 2 Mengen vereinigen oder schneiden können soll ist mir hier aber erstmal ein Rätsel. Dazu braucht man ja erstmal eine Mengendefinition. Das ist ja wieder ein komplett anderes Thema.
-
Die Vereinigung von zwei Intervallen ist in der Regel nicht wieder ein Intervall (Intervalle bilden einen Halbring. Hat Wahrscheinlichkeitstheorie I doch was genützt.) Und beim Schnitt haben wir das kleine Problem, dass wir dann auch leere Intervalle zulassen müssen. Das kann z.B. die Definition von unskilled nicht.
-
Werner Salomon schrieb:
intervall schrieb:
Gibt es in der STL bereits eine Funktion ob sich eine Zahl in einem Intervall befindet?
Zum Beispiel die Zahl 5 im Intervall 1 bis 10 befindet?
bei boost gibt es so etwas
#include <iostream> #include <boost/numeric/interval.hpp> int main() { using namespace std; boost::numeric::interval< int > bereich(1,10); for( int zahl; cin >> zahl; ) cout << zahl << " liegt " << (in( zahl, bereich )? "": "nicht ") << "im Bereich [" << bereich.lower() << ";" << bereich.upper() << "]" << endl; return 0; }
Weißt du ob man dabei auch ob/wie man offene/geschlossene intervalle bestimmen kann? Das wäre nämlich genau das was ich gebrauchen könnte.
-
intervall schrieb:
Weißt du ob man dabei auch ob/wie man offene/geschlossene intervalle bestimmen kann? Das wäre nämlich genau das was ich gebrauchen könnte.
in boost.interval ist jedes Intervall immer ein geschlossenes Intervall.
Gruß
Werner
-
player4245 schrieb:
Die C++0x Lösung. Warum einfach wenns auch umständlich geht^^
ach was
[](int l, int r, int x) { return l < x && x < r; } ( 1, 10, 5 );
Ich nehm mal an, dass dass so ungefähr korrekt ist.