I was looking at generate() and generate_n() in cppreference and am trying to understand why does generate() require ForwardIterator, whereas generate_n() requires OutputIterator for the range? (I checked the latest working draft of the Standard, and it's the same requirement.)
Because, at least their possible implementations seem to require identical iterator concepts and OutputIterator seems to be enough:
generate():
template<class ForwardIt, class Generator>
void generate(ForwardIt first, ForwardIt last, Generator g)
{
while (first != last) {
*first++ = g();
}
}
generate_n():
template<class OutputIt, class Size, class Generator>
OutputIt generate_n(OutputIt first, Size count, Generator g)
{
for (Size i = 0; i < count; i++) {
*first++ = g();
}
return first;
}
Same story with std::fill() and std::fill_n().