使用C++ 11,STL现在具有std::iota
函数(请参阅reference)。然而,与std::fill_n
,std::generate_n
相反,没有std::iota_n
。这将是一个很好的实施?使用简单的lambda表达式(备选方案2)直接循环(备选方案1)或委托给std::generate_n
?什么是iota_n的好实现(缺少STL算法)
备选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++; });
}
会两个替代方案产生具有优化编译器的等效代码?
UPDATE:结合了@Marc Mutz的优点,也可以在目标点返回迭代器。与C++ 98相比,这也是如何在C++ 11中更新std::generate_n
。
我认为这个问题的重点是太具体的东西更普遍的东西:不同的循环结构。 – 2012-08-01 21:04:08
为什么不尝试它并比较汇编器? – 2012-08-01 21:04:42
@KerrekSB没有那么多的grokking汇编输出专家。我有兴趣从具有这种专业知识的人那里听到,如果STL带lambda的带子通常会优化为直线圈。如果是这样的话,这将是一个更大的动机来写更多的STL算法的变体,而不是思考错综复杂的循环。 – TemplateRex 2012-08-01 21:07:15