Personalmente, mi lectura inicial de:
std::generate(numbers.begin(), numbers.end(), rand);
es "estamos asignando a todo en un rango. El rango es numbers
. Los valores asignados son aleatorios".
Mi lectura inicial de:
for (int& x : numbers) x = rand()
es "estamos haciendo algo con todo en un rango. El rango es numbers
. Lo que hacemos es asignar un valor aleatorio".
Son bastante similares, pero no idénticos. Una razón plausible por la que podría querer provocar la primera lectura es porque creo que el hecho más importante de este código es que se asigna al rango. Así que ahí está su "por qué querría ...". Lo uso generate
porque en C ++ std::generate
significa "asignación de rango". Como lo hace por cierto std::copy
, la diferencia entre los dos es desde qué estás asignando.
Sin embargo, existen factores de confusión. Los bucles for basados en rango tienen una forma inherentemente más directa de expresar que el rango es numbers
, que los algoritmos basados en iteradores. Es por eso que la gente trabaja en bibliotecas de algoritmos basados en rangos: se boost::range::generate(numbers, rand);
ve mejor que la std::generate
versión.
En contra de eso, int&
en su bucle for basado en rango hay una arruga. ¿Qué pasa si el tipo de valor del rango no lo es int
, entonces estamos haciendo algo molestamente sutil aquí que depende de que sea convertible a int&
, mientras que el generate
código solo depende del retorno de rand
ser asignable al elemento? Incluso si el tipo de valor es int
, podría detenerme a pensar si lo es o no. Por auto
lo tanto , lo que pospone pensar en los tipos hasta que veo lo que se asigna - con auto &x
digo "tome una referencia al elemento de rango, sea cual sea el tipo que pueda tener". En C ++ 03, los algoritmos (porque son plantillas de funciones) eran la forma de ocultar tipos exactos, ahora son una forma.
Creo que siempre ha sido el caso de que los algoritmos más simples tienen solo un beneficio marginal sobre los bucles equivalentes. Los bucles for basados en rangos mejoran los bucles (principalmente al eliminar la mayor parte del texto estándar, aunque hay un poco más que eso). Por lo tanto, los márgenes se reducen y quizás cambie de opinión en algunos casos específicos. Pero todavía hay una diferencia de estilo allí.