Лично мое первоначальное прочтение:
std::generate(numbers.begin(), numbers.end(), rand);
это «мы назначаем все в диапазоне. Диапазон равен numbers
. Присвоенные значения случайны».
Мое первое прочтение:
for (int& x : numbers) x = rand();
это «мы делаем что-то для всего в диапазоне. Диапазон есть numbers
. Что мы делаем, так это присваиваем случайное значение».
Они чертовски похожи, но не идентичны. Одна вероятная причина, по которой я мог бы спровоцировать первое чтение, состоит в том, что я думаю, что наиболее важным фактом в этом коде является то, что он присваивает диапазон. Итак, вот ваше «зачем мне…». Я использую, generate
потому что в C ++ std::generate
означает «присвоение диапазона». Как, кстати,std::copy
, разница между ними заключается в том, что вы назначаете.
Однако есть смешивающие факторы. Циклы for, основанные на диапазоне, по своей сути имеют более прямой способ выражения диапазона numbers
, чем алгоритмы на основе итераторов. Вот почему люди работают с библиотеками алгоритмов на основе диапазонов: boost::range::generate(numbers, rand);
выглядит лучше, чемstd::generate
версия.
В отличие от этого, int&
в вашем цикле for на основе диапазона есть морщинка. Что, если тип значения диапазона не является типом значения int
, тогда мы делаем здесь что-то раздражающе тонкое, что зависит от его преобразования int&
, в то время как generate
код зависит только от того, что возврат может rand
быть назначен элементу. Даже если тип значения есть int
, я все равно могу остановиться, чтобы подумать, так оно или нет. Следовательно auto
, это откладывает размышления о типах до тех пор, пока я не увижу, что назначается - auto &x
я говорю: «возьмите ссылку на элемент диапазона, какой бы тип он ни имел». Еще в C ++ 03, алгоритмы (потому что они шаблоны функций) были способом скрыть точные типы, теперь они путь.
Я думаю, что всегда было так, что простейшие алгоритмы имели лишь незначительное преимущество перед эквивалентными циклами. Циклы for на основе диапазона улучшают циклы (в первую очередь за счет удаления большей части шаблонного кода, хотя это еще не все). Таким образом, поля становятся более узкими, и, возможно, вы передумаете в некоторых конкретных случаях. Но разница в стилях все же есть.