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()
undstd::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
undstd::tr1::bind
hat man sehr mächtige Werkzeuge zur Hand.