for_each mit memberfunktionen
-
Hallo zusamms,
ich habe (hatte) folgendes Problem:
Ich würde gerne alle Elemente eines STL-Vektors hintereinander als Argument von eine Methode einer Klasse übergeben, also ein Äquivalent für:myclass *myobj; vector<int> a; // void myclass::doit(int wert) myobj->doit(a[0]); myobj->doit(a[1]); myobj->doit(a[2]); // usw...Hier bietet sich natürlich ein for_each an, jetzt muss ich nur noch die Methode doit der Klasse (*myobj) in ein "unäres Funktionsobjekt" (heisst das so?) umwandeln, die Lösung, die ich gefunden habe ist:
myclass *myobj; vector<int> a; for_each(a.begin(),a.end(), bind1st(mem_fun(&myclass::doit)), myobj));Gibt es eine andere Möglichkeit, als das umständliche
bind1st(mem_fun(&myclass::doit)), myobj))Konstrukt?
LG, J.
-
Wieso nicht einfach
for (vector<int>::iterator it = a.begin(); it != a.end(); ++it) myobj->doit(*it);?
-
mit boost::bind kannst du das schneller machen
for_each(v.begin(),v.end(),boost::bind(&myclass::doit,myobj));
-
Du meinst hoffentlich
std::for_each(v.begin(), v.end(), boost::bind(&myclass::doit, myobj, _1));oder?

-
Gerade in Hinblick auf groovemasters Posting: Ist die Verwendung eines STL-Algorithmus wirklich signifikant schneller als das "Ausschreiben" einer normalen for-Schleife? Welchen Nutzen hat erstere noch, außer, daß sie eine kürzere Schreibweise hat?
-
dass du dich nicht um das kümmern musst, was for_each für dich erledigt?
for_each ist fehlerfrei, schon allein deshalb sollte mans benutzen, bevor man einen schusselfehler einbaut
-
dass du dich nicht um das kümmern musst, was for_each für dich erledigt?
Das ist ja auch so höllisch kompliziert.
-
Cocaine: Für oft wiederkehrende Sachen ist es ganz hübsch, aber gerade bei speziellen Sachen die uU nur einmal im Programm vorkommen schreibt man sich ne Schleife statt einen extra-Functor zu bauen.
-
otze schrieb:
dass du dich nicht um das kümmern musst, was for_each für dich erledigt?
for_each ist fehlerfrei, schon allein deshalb sollte mans benutzen, bevor man einen schusselfehler einbaut
Ich find die zweizeilige for-Schleife zunächst mal leichter nachzuvollziehen, als den UnaryFunction-Kram. Klar gewöhnt man sich dran, aber das ist doch nur sinnvoll, wenn man auch was von hat, oder nicht?
edit
@Mastah: Ok, hübsch ist es - zumal man sofort an for_each, find, transform etc. erkennt, was Sache ist und nicht erst die for-Schleife durchgucken muß. Das kann ein Kommentar allerdings auch...
-
Cocaine: Für oft wiederkehrende Sachen ist es ganz hübsch, aber gerade bei speziellen Sachen die uU nur einmal im Programm vorkommen schreibt man sich ne Schleife statt einen extra-Functor zu bauen.
Imo aber nicht deshalb, weil es der bessere Weg ist sondern weil es C++ hier einem unnötig schwer macht.
Ich bevorzuge in solchen Situationen BOOST_FOREACH:
BOOST_FOREACH(int i, vec) { myObj.doIt(i); }Letztlich fände ich ein eingebautes for_each oder von mir aus auch ein Block-Konstrukt zusammen mit Lambda-Ausdrücken schöner.