In general, the STL only provides primitives from which one can define suitably adapted variants.
The SGI documentation gives the following rationale for providing the exceptions you noted:
copy_n
works for Input Iterators that are not also Forward Iterators.fill_n
andgenerate_n
work for Output Iterators that are not also Forward Iterators.
As pointed out by @Jared Hoberock in the comments, the <memory>
header also has uninitialized_
versions of copy_n
and fill_n
that are optimized versions when the count is already known.
C++11 provides a few other convenience wrappers (e.g. find_if_not
), but with lambda predicates such wrappers become a lot easier to write yourself.
Note: there is also a search_n
but this has different semantics than search
because the latter will look at overlap between two input ranges and the former will look at consecutive elements from a single input range.