iota模板函数已添加到标准库中,以使用递增的值序列填充迭代器范围。
template<typename ForwardIterator, typename Tp>
void
iota(ForwardIterator first, ForwardIterator last, Tp value)
{
for (; first != last; ++first)
{
*first = value;
++value;
}
}
<numeric>
中的大多数其他模板都有接受用户指定运算符的版本。
有这个:
template<typename ForwardIterator, typename Tp, typename Operator>
void
iota(ForwardIterator first, ForwardIterator last, Tp value, Operator op)
{
for (; first != last; ++first)
{
*first = value;
op(value);
}
}
如果你不想(或不能)为Tp重载operator ++(),那么会很方便。我会发现这个版本比默认的operator ++()版本更广泛使用。 &LT;
答案 0 :(得分:5)
我怀疑原因通常是以下一个或多个原因的混合:
copy_if
)std::generate
轻松替换。答案 1 :(得分:4)
使用lambda,第二个版本节省不多,你可以使用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;});
}
实际上,这使得std::iota
的现有实现非常冗余:
template<typename ForwardIterator, typename Tp>
void iota(ForwardIterator first, ForwardIterator last, Tp value)
{
std::generate(first, last, [&value](){return value++;});
}