Re: standard vs. hand crafted loops
In article <1147114512.131883.144670
@v46g2000cwv.googlegroups.com>, pavel.turbin@gmail.com
says...
I've seen many times advise to use standard loops e.g. for_each,
instead of iterator and for loop. I was trying to follow this hint.
But, it looks it involves extra complexity and the code getting larger
without any benefits for me.
[ ... ]
#include <numeric>
#include <vector>
#include <algorithm>
#include <functional>
class MyData // some object
{
std::string m_s;
public:
MyData( const std::string &s ) : m_s(s) {}
// Definitely cheating here!
operator size_t() const { return m_s.length(); }
// used by the loop, but not the algorithm.
size_t len() const { return m_s.length(); }
};
int main(int argc, char* argv[])
{
std::vector<MyData> vec;
vec.push_back(MyData("a"));
vec.push_back(MyData("b"));
vec.push_back(MyData("c"));
// The short code using an algorithm:
size_t total;
std::accumulate(vec.begin(), vec.end(), total);
// hand-written loop is longer:
total = 0;
for( std::vector<MyData>::iterator i=vec.begin();
i < vec.end();++i)
total += i->len();
return 0;
}
Using for_each it takes 10 lines and auxiliary Function object. Compare
"for" loop it is only 3 lines. Such example looks as very common case,
it is typical to perform two or more operations on container. Create
function object looks as extra useless work.
I rarely use std::for_each. In nearly every case,
something else works better. In this case I'll admit I
cheater -- the standard way would be to use mem_fun and
bind1st (or some such combination) to get accumulate to
call the memory function. Boost has a couple of
possibilities that should probably be handy as well.
--
Later,
Jerry.
The universe is a figment of its own imagination.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]