Jaka byłaby dobra implementacja iota_n (brakujący algorytm z STL)
W C ++ 11 STL ma terazstd::iota
funkcja (patrz aodniesienie). W odróżnieniustd::fill_n
, std::generate_n
, nie mastd::iota_n
, jednak. Jaka byłaby do tego dobra implementacja? Pętla bezpośrednia (alternatywa 1) lub delegacja dostd::generate_n
z prostym wyrażeniem lambda (alternatywa 2)?
Alternatywa 1)
template<class OutputIterator, class Size, class T>
OutputIterator iota_n(OutputIterator first, Size n, T value)
{
while (n--)
*first++ = value++;
return first;
}
Alternatywa 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++; });
}
Czy obie alternatywy wygenerują równoważny kod z kompilatorami optymalizującymi?
AKTUALIZACJA: włączył doskonały punkt @Marc Mutz, aby również zwrócić iterator w punkcie docelowym. Tak też jeststd::generate_n
został zaktualizowany w C ++ 11 w porównaniu z C ++ 98.