Особисто я прочитав:
std::generate(numbers.begin(), numbers.end(), rand);
є "ми призначаємо все в діапазоні. Діапазон є numbers
. Присвоєні значення є випадковими".
Моє початкове читання:
for (int& x : numbers) x = rand();
"ми робимо щось для всього в діапазоні. Діапазон є numbers
. Що ми робимо, це присвоюємо випадкове значення."
Це дуже чорно схожі, але не однакові. Однією з правдоподібних причин, яку я міг би викликати до першого читання, є те, що я думаю, що найважливішим фактом цього коду є те, що він присвоює діапазон. Тож є ваше "чому я хотів би ...". Я використовую, generate
тому що в C ++ std::generate
означає "присвоєння діапазону". Як і до речі std::copy
, різниця між ними полягає в тому, з чого ви призначаєте.
Однак є незрозумілі фактори. На основі діапазону для циклів за своєю суттю більш прямий спосіб виразити, що діапазон є numbers
, ніж алгоритми на основі ітераторів. Ось чому люди працюють над бібліотеками алгоритмів на основі діапазону: boost::range::generate(numbers, rand);
виглядає краще, ніж std::generate
версія.
На відміну від цього, int&
у вашому діапазоні циклу for є зморшка. Що робити, якщо тип значення діапазону не є int
, тоді ми робимо щось надокучливо тонке, що залежить від того, наскільки він конвертований int&
, тоді як generate
код залежить лише від повернення від rand
присвоєння елементу. Навіть якщо тип значення такий int
, я все одно можу зупинитися, щоб подумати, чи є це чи ні. Отже auto
, що відкладає роздуми про типи, поки я не побачу, що їм присвоюють - auto &x
я кажу "взяти посилання на елемент діапазону, який би тип не міг бути". Ще в C ++ 03, алгоритми (бо вони шаблони функцій) були способом приховати точні типи, тепер вони шлях.
Я думаю, що завжди було так, що найпростіші алгоритми мають лише незначну перевагу над еквівалентними циклами. Діапазон петель для поліпшення циклів покращує петлі (насамперед, видаляючи більшу частину шаблону, хоча в них є трохи більше, ніж це). Тож поля стають жорсткішими, і, можливо, ви передумаєте в деяких конкретних випадках. Але там все ще є різниця в стилі.