std::for_each
возвращает функтор, который использовался внутри цикла, поэтому он обеспечивает чистый механизм для сбора некоторой информации, касающейся элементов в последовательности. Диапазон, основанный на цикле for, является просто циклом, поэтому любое состояние, которое должно использоваться вне цикла, должно быть объявлено вне этой области. В вашем примере, если цель циклов состоит в том, чтобы мутировать каждый элемент последовательности, тогда нет большой разницы вообще. Но если вы не используете возвращаемое значение for_each
, то вам, вероятно, лучше с простым циклом. Кстати, цикл на основе диапазона работает и с массивами в стиле C, и с std :: strings.
Это пример использования возвращаемого значения for_each
, хотя оно не очень оригинально или полезно. Это просто для иллюстрации идеи.
#include <iostream>
#include <array>
#include <algorithm>
struct Foo {
void operator()(int i) { if (i > 4) sum += i;}
int sum{0};
};
int main() {
std::array<int, 10> a{1,2,3,4,5,6,7,8,9,10};
Foo foo = std::for_each(a.begin(), a.end(), Foo());
std::cout << "Sum " << foo.sum << "\n";
}