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,34

    und 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


Log in to reply