Funktionsadapter !?!?!



  • Irgendwie verstehe ich folgende Zeile in dem Script unseres Professors nicht ??
    Könntet ihr mir da mal helfen ...

    list<int>::iterator p1;
    p1 = find (menge.begin(), menge.end(),
    bind2nd(greater<int>(),3));
    

    Bei greater handelt es sich um eine vordefiniertes Funktonsobjekt ...
    Wie die Funktion arbeitet ist auch klar ...allerdings verstehe ich den Sinn von bind2nd nicht , oder ich bin mir einfach nicht sicher ob es so stimmt wie ich es mir denke ...
    Bedeutet es soviel wie dass die 3 kontinuierlich als zweiter Übergabe paramter an das Funtonsobjekt übergeben wird???



  • Ja. Als Resultat erhälst du dann eine unary_function . Aber so alleine macht der Binder keinen Sinn.



  • list<int>::iterator p1;
    p1 = find( menge.begin(), menge.end(), bind2nd(greater<int>(),3) );
    

    Für jedes Element von menge zwischen ".begin()" und ".end()" wird die Funktion greater<int> aufgerufen. Dies kann man sich so vorstellen:

    greater<int>( menge, 3 )
    

    Sollte die Funktion true zurückliefern wird das Element in die Auflistung p1 übernommen.

    Vllt noch hier ne kurze hilfe zu bind2nd: http://www.cplusplus.com/reference/std/functional/bind2nd/

    Mfg Marco

    edit: Tags richtig gesetzt



  • Ad aCTa schrieb:

    Aber so alleine macht der Binder keinen Sinn.

    doch - nur der zeilenumbruch ist ein wenig fail



  • > doch - nur der zeilenumbruch ist ein wenig fail

    *Auf Stirn klatsch* Man sollte den Code schon genauer lesen... 😃



  • Nur so als Anmerkung: std::bind1st() und std::bind2nd() sind verbuggt, da sie nicht mit Referenzen umgehen können. Überhaupt sind die funktionalen Hilfsklassen- und Funktionen der C++-Standardbibliothek nicht besonders flexibel.

    Anders siehts aus, wenn man den TR1 (oder Boost) benutzen kann, was auf die meisten aktuellen StdLib-Implementierungen zutrifft. Mit std::tr1::function und std::tr1::bind hat man sehr mächtige Werkzeuge zur Hand.


Log in to reply