Re: What's the advantage of using for_each loop?
On May 30, 5:02 pm, "Robbie Hatley" <bogus.addr...@no.spam> wrote:
<v.r.mari...@gmail.com> wrote:
The cool thing about for_each is:
1) you can pass the function objects by reference
I don't see how that could work. I thought the function
object is always passed by value?
They are.
I tried passing a function object to a for_each loop once,
where the function object was collecting data about
operations. But that didn't work, because for_each used a
*copy* of the object, rather than the object itself.
I was writing a spelling-checker, just for programming
practice. The for_each loop looked something like:
Append FuncObj = Append(Dictionary);
for_each(Dicts.begin(), Dicts.end(), FuncObj);
("Dicts" is a list of file paths, and "Dictionary" is a list
of words.)
But the the counts of files and lines went into the unnamed
*copy* of FuncObj, not FuncObj itself.
The STL requires functional objects to have value semantics, so
you would (generally) write something like:
Append FuncObj( for_each( Dicts.begin(),
Dicts.end(),
Append( Dictionary ) ) ) ;
The problem becomes more difficult if you are trying to use a
polymorphic object; you have to give it value semantics which do
not loose the polymorphic behavior, by means of the
letter/envelope idiom, or something similar. (Often, just a
small wrapper around a pointer will do the trick.)
2) you can apply side-effects on the function object
?
The function object can do just about anything which won't
invalidate the iterators. Including modifying program state.
3) you can use the return value of the for_each() algorithm
Hmmm.... Interesting. Perhaps, then, something like the following
would work in my spelling checker (could be used to count files --
or lines -- appended to a list of strings):
Append FuncObjCopy =
for_each(Dicts.begin(), Dicts.end(), Append(Dictionary););
cout << "Files processed = " << FuncObjCopy.files << endl;
cout << "Lines processed = " << FuncObjCopy.lines << endl;
Not quite as nice as getting for_each to use the original function
object, but almost.
In some contexts (including this one, IMHO), it's even nicer.
In others (i.e. polymorphic agents), it's a real pain you know
where.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34