Re: standard vs. hand crafted loops
Daniel T. wrote:
I don't quite agree. I will agree that sometimes a for loop does a
better job than any algorithm, but I don't think it is right to say that
any one algorithm is always worse than any equivalent for loop. Even
for_each has a place in the world.
Even goto has a place in the world, too.
Maybe the example from "The C++
Programming Language" would be appropriate.
class Extract_officers {
list<Person*>& lst;
public:
void operator()(const Club& c ) {
copy(c.officers.begin(), c.officers.end(), back_inserter(lst));
}
};
void extract(const list<Club>& lc, list<Person*>& off) {
for_each(lc.begin(), lc.end(), Extract_officers(off));
}
How would that look as loops instead?
void extract(const list<Club>& lc, list<Person*>& off) {
for ( list<Club>::iterator it = lc.begin(); it != lc.end(); ++it ) {
for ( list<Person*>::iterator it2 = it->officers.begin();
it2 != it->officers.end(); +
+it2 ) {
off.push_back( *it2 );
}
}
}
To me, the for loops in the latter example are obfuscating the job being
done to the point of illegibility.
First, you forgot to write a constructor for your Extract_officers. That
will make the code longer and further hide its intent. Second, you are
using the wrong baseline. The baseline you should be comparing against is:
void Extract_officers(list<Person*>& lst, const Club& c) {
copy(c.officers.begin(), c.officers.end(), back_inserter(lst));
}
void extract(const list<Club>& lc, list<Person*>& off) {
for(list<Club>::iterator i = lc.begin();
i != lc.end(); ++i) {
Extract_officers(off));
}
}
which all of a sudden looks quite attractive.
Andrei
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]