Write clearly – don't sacrifice clarity for "efficiency".— Kernighan, Plauger [The Elements of Programming Style]
Die in C++11 eingeführte Anweisung "for each object in range", auch "range-based for loop" genannt, sieht fast wie Java (ab Version 5, "Tiger") aus
std::vector<int> v = { 1, 2, 3, 4 }; for (auto e : v) std::cout << e << ' ';
und bewirkt dasselbe wie
for (std::vector<int>::iterator iter = v.begin(), last = v.end(); iter != last; ++iter) { int e = *iter; std::cout << e << ' '; }
Die "range for"-Anweisung ist auch für gewöhnliche Felder nutzbar.
double arr[] = { 1.2, 2.3, 3.4 }; for (double& e : arr) e *= 2; for (double e : arr) std::cout << e << ' '; // 2.4 4.6 6.8
Den Typ der Containerelemente kann der Compiler auch automatisch erkennen. Durch Referenzen ist der Inhalt von nichtkonstanten Containern änderbar:
for (auto element : container) // Wertkopie ... for (auto& element : container) // Referenzzugriff ... for (auto const& element : container) // schreibgeschützt ...
In generischen Funktionen empfiehlt sich
for (auto&& element : container) // ...
Dies funktioniert für konstante und nicht konstante Elemente sowie Proxy-Objekte.