Can you tell me why (2) is better than (1)?
Personally, I find it better because of a change in thought pattern. With a loop, I am inclined to think about how the loop works. With the application of such a generic algorithm, I am inclined to think about the range that is being processed. In this case the code happens to be shorter too, but if you write out a function object separately that would not be the case.

(2) Requires so much understanding of underground stuff! Whereas for ( ; ; ) is known to every C++ beginner!?
That should not be a concern though: the question is whether the code would be easy to understand once one understands the constructs.