C++11 では、STL にstd::iota
関数が追加されました (参照を参照)。ただし、 とは対照的にstd::fill_n
、std::generate_n
はありませんstd::iota_n
。そのための良い実装は何でしょうか? 直接ループ (代替 1) またはstd::generate_n
単純なラムダ式による委任 (代替 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++; });
}
両方の選択肢は、最適化コンパイラで同等のコードを生成しますか?
UPDATE : @Marc Mutz の優れた点を組み込み、目的のポイントでイテレータも返すようにしました。これはstd::generate_n
、C++98 と比較して C++11 で更新された方法でもあります。