I’m always trying to learn more about the languages I use (different styles, frameworks, patterns, etc). I’ve noticed that I never use std::for_each so I thought that perhaps I should start. The goal in such cases is to expand my mind and not to improve the code in some measure (readability, expressiveness, compactness, etc).
So with that context in mind, is a good idea to use std::for_each for simple tasks like, say, printing out a vector:
for_each(v.begin(), v.end(), [](int n) { cout << n << endl; }
(The [](int n) being a lambda function). Instead of:
for(int i=0; i<v.size(); i++) { cout << v[i] << endl; }
I hope this question doesn’t seem pointless. I guess it almost asks a larger question… should an intermediate programmer use a language feature even though he doesn’t really need to at this time but just so that he can understand the feature better for a time that may actually greatly benefit from it. Although this larger question has probably already been asked (e.g. here).
There is an advantage to using
std::for_eachinstead of an old schoolforloop (or even the newfangled C++0x range-forloop): you can look at the first word of the statement and you know exactly what the statement does.When you see the
for_each, you know that the operation in the lambda is performed exactly once for each element in the range (assuming no exceptions are thrown). It isn’t possible to break out of the loop early before every element has been processed and it isn’t possible to skip elements or evaluate the body of the loop for one element multiple times.With the
forloop, you have to read the entire body of the loop to know what it does. It may havecontinue,break, orreturnstatements in it that alter the control flow. It may have statements that modify the iterator or index variable(s). There is no way to know without examining the entire loop.Herb Sutter discussed the advantages of using algorithms and lambda expressions in a recent presentation to the Northwest C++ Users Group.
Note that you can actually use the
std::copyalgorithm here if you’d prefer: