在 C++11 中,STL 现在有了一个std::iota
函数(参见参考资料)。然而,与 , 相比std::fill_n
,std::generate_n
没有std::iota_n
。什么是一个好的实现呢?std::generate_n
直接循环(备选方案 1)或使用简单 lambda 表达式(备选方案 2)的委托?
备选方案 1)
template<class OutputIterator, class Size, class T>
OutputIterator iota_n(OutputIterator first, Size n, T value)
{
while (n--)
*first++ = value++;
return first;
}
备选方案 2)
template<class OutputIterator, class Size, class T>
OutputIterator iota_n(OutputIterator first, Size n, T value)
{
return std::generate_n(first, n, [&](){ return value++; });
}
两种替代方案都会通过优化编译器生成等效代码吗?
更新:结合了@Marc Mutz 的优点,还可以在其目标点返回迭代器。与 C++98 相比,这也是std::generate_n
C++11 中的更新方式。