Con C++ 11, l'STL ha ora una funzione std::iota
(vedere uno reference). A differenza di std::fill_n
, std::generate_n
, tuttavia, non esiste lo std::iota_n
. Quale sarebbe una buona implementazione per questo? Un ciclo diretto (alternativa 1) o delega a std::generate_n
con un'espressione lambda semplice (alternativa 2)?Quale sarebbe una buona implementazione di iota_n (algoritmo mancante da STL)
Alternativa 1)
template<class OutputIterator, class Size, class T>
OutputIterator iota_n(OutputIterator first, Size n, T value)
{
while (n--)
*first++ = value++;
return first;
}
Alternativa 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++; });
}
Sarebbe entrambe le alternative generare il codice equivalente con l'ottimizzazione dei compilatori?
UPDATE: ha incorporato l'eccellente punto di @Marc Mutz per restituire l'iteratore nel punto di destinazione. Questo è anche il modo in cui std::generate_n
viene aggiornato in C++ 11 rispetto a C++ 98.
Credo che questa domanda si concentra su qualcosa di troppo specifico per qualcosa di più generale: i diversi costrutti di loop. –
Perché non lo provi e confronti l'assemblatore? –
@KerrekSB Non molto esperto di produzione di assemblaggi groking. Sono interessato ad ascoltare da persone con tale esperienza se i oneliner STL con lambda saranno normalmente ottimizzati per lo straight loop. Se è il caso, questo sarebbe un incentivo più grande per scrivere più variazioni sugli algoritmi STL, piuttosto che pensare seriamente a circuiti complessi. – TemplateRex