Wert gegeben -> aus Liste beste Annäherung finden
-
Hallo,
ich habe folgendes Problem (für die Auswahl des passenden String: 4:3, 16:9, 5:4 ...:
Gegeben ist ein Double-Wert z.B.:
1,34und eine Liste von Double-Werte:
{ (double)4/3, (double)5/4, (double)16/9, (double)21/9, ... }Gesucht ist jetzt der Index des Listenelements, das am nächsten am gegebenen Wert ist.
Bietet mir C oder C++ (Visual Studio) mir dafür eine fertige Methode oder Funktion?
Oder muss ich es selber programmieren?
Das würde ich schon hinkriegen, aber vllt. gibts ja was fertiges.
-
Eine Kombination aus min_element und passendem Funktionsobjekt.
-
dlgig schrieb:
Bietet mir C oder C++ (Visual Studio) mir dafür eine fertige Methode oder Funktion?
Ja - der C++-Standard in Kombination mit boost.bind bietet Dir (mehr oder weniger) was fertiges. Das sähe dann so aus:
#include <algorithm> #include <functional> // minus #include <iostream> #include <cmath> // abs(double) #include <boost/bind.hpp> int main() { using namespace std; using boost::bind; const double liste[] = { 4./3, 5./4, 16./9, 21./9 }; for( double d; cout << "> ", cin >> d; ) cout << *min_element( liste, liste + sizeof(liste)/sizeof(*liste), bind( static_cast< double(*)( double ) >( &std::abs ), bind( minus< double >(), _1, d ) ) < bind( static_cast< double(*)( double ) >( &std::abs ), bind( minus< double >(), _2, d ) ) ) << " liegt " << d << " am naechsten" << endl; return 0; }
Die Ausgabe ist z.B.:
> 1.2 1.25 liegt 1.2 am naechsten > 1.3 1.33333 liegt 1.3 am naechsten > 1.8 1.77778 liegt 1.8 am naechsten > 25 2.33333 liegt 25 am naechsten >
Gruß
Werner