With lambdas, the second version does not save much, you can just use std::generate .
template<typename ForwardIterator, typename Tp, typename Operator> void iota(ForwardIterator first, ForwardIterator last, Tp value, Operator op) { std::generate(first, last, [&value,&op](){auto v = value; op(value); return v;}); }
In fact, this makes the existing std::iota very redundant:
template<typename ForwardIterator, typename Tp> void iota(ForwardIterator first, ForwardIterator last, Tp value) { std::generate(first, last, [&value](){return value++;}); }
source share