使用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