Persönlich meine erste Lektüre von:
std::generate(numbers.begin(), numbers.end(), rand);
ist "Wir weisen alles in einem Bereich zu. Der Bereich ist numbers
weisen . Die zugewiesenen Werte sind zufällig".
Meine erste Lektüre von:
for (int& x : numbers) x = rand();
ist "wir machen etwas mit allem in einem Bereich. Der Bereich ist numbers
. Wir weisen einen zufälligen Wert zu."
Die sind verdammt ähnlich, aber nicht identisch. Ein plausibler Grund, warum ich die erste Lesung provozieren möchte, ist, dass ich denke, dass die wichtigste Tatsache an diesem Code ist, dass er dem Bereich zugeordnet ist. Also gibt es dein "Warum sollte ich ...". Ich benutze, generate
weil in C ++ std::generate
"Bereichszuweisung" bedeutet. Wie übrigensstd::copy
ist der Unterschied zwischen den beiden, was Sie zuweisen.
Es gibt jedoch verwirrende Faktoren. Bereichsbasierte for-Schleifen haben eine von Natur aus direktere Möglichkeit, den Bereich auszudrücken numbers
, als iteratorbasierte Algorithmen. Deshalb arbeiten die Leute an bereichsbasierten Algorithmusbibliotheken: boost::range::generate(numbers, rand);
Sieht besser aus als diestd::generate
Version.
Im Gegensatz dazu ist int&
in Ihrer bereichsbasierten for-Schleife eine Falte. Was ist, wenn der Werttyp des Bereichs nicht der Fall ist? int
Dann machen wir hier etwas ärgerlich Feines, das davon abhängt, ob er konvertierbar ist int&
, während der generate
Code nur von der Rückkehr abhängt, rand
wenn er dem Element zugewiesen werden kann. Selbst wenn der Werttyp ist int
, könnte ich immer noch darüber nachdenken, ob dies der Fall ist oder nicht. Daher auto
wird das Nachdenken über die Typen verschoben, bis ich sehe, was zugewiesen wird - mit der auto &x
Aussage "Nehmen Sie einen Verweis auf das Bereichselement, welchen Typ auch immer". Zurück in C ++ 03 waren Algorithmen (weil sie Funktionsvorlagen sind) der Weg, um exakte Typen zu verbergen, jetzt sind sie ein Weg.
Ich denke, es war schon immer so, dass die einfachsten Algorithmen nur einen geringfügigen Vorteil gegenüber den äquivalenten Schleifen haben. Range-based for-Schleifen verbessern Schleifen (hauptsächlich durch Entfernen des größten Teils der Boilerplate, obwohl sie etwas mehr enthalten). Die Ränder werden also enger und vielleicht ändern Sie Ihre Meinung in bestimmten Fällen. Aber da gibt es immer noch einen Stilunterschied.