Osobiście moje pierwsze czytanie:
std::generate(numbers.begin(), numbers.end(), rand);
to „przypisujemy wszystko w zakresie. Zakres to numbers
. Przypisane wartości są losowe”.
Moja pierwsza lektura:
for (int& x : numbers) x = rand();
to „robimy coś dla wszystkiego w zakresie. Zakres wynosi numbers
. To, co robimy, to przypisywanie losowej wartości”.
Te są cholernie podobne, ale nie identyczne. Jednym z możliwych powodów, dla których mógłbym chcieć sprowokować pierwsze czytanie, jest to, że uważam, że najważniejszym faktem dotyczącym tego kodu jest to, że przypisuje on zakres. Więc jest twoje "dlaczego miałbym chcieć ...". Używam, generate
ponieważ w C ++ std::generate
oznacza „przypisanie zakresu”. Tak przy okazji std::copy
, różnica między nimi polega na tym, z czego przypisujesz.
Istnieją jednak czynniki mylące. Pętle for oparte na zakresie mają z natury bardziej bezpośredni sposób wyrażania, że jest to zakres numbers
, niż robią to algorytmy oparte na iteratorach. Dlatego ludzie pracują na bibliotekach algorytmów opartych na zakresach: boost::range::generate(numbers, rand);
wygląda lepiej niż std::generate
wersja.
W przeciwieństwie do tego, int&
w twoim zakresie pętli for jest zmarszczka. A co jeśli typ wartości zakresu nie jest int
, to robimy tutaj coś irytująco subtelnego, co zależy od tego, czy można go zamienić na int&
, podczas gdy generate
kod zależy tylko od powrotu z rand
przypisania do elementu. Nawet jeśli typ wartości to int
, nadal mogę przestać myśleć o tym, czy tak jest, czy nie. Stąd auto
, co odkłada myślenie o typach, dopóki nie zobaczę, co zostanie przypisane - auto &x
mówię „weź odwołanie do elementu zakresu, dowolnego typu, który może mieć”. Powrót w C ++ 03, algorytmy (bo są szablony funkcyjne) były sposób ukryć dokładnych typów, teraz są sposób.
Myślę, że zawsze było tak, że najprostsze algorytmy miały tylko marginalną korzyść w porównaniu z równoważnymi pętlami. Oparte na zakresie pętle for poprawiają pętle (głównie poprzez usunięcie większości kotłów, chociaż jest ich trochę więcej). Tak więc marginesy są coraz ciaśniejsze i być może zmienisz zdanie w niektórych szczególnych przypadkach. Ale nadal istnieje różnica stylu.