Aug 11, 2014 14:07
Потому что многобукв. Цикл - написать проще, чем вызывать std::accumulate с нужными параметрами. Как в C++11, так и до. Пусть нам надо просуммировать x.field типа float, где x из контейнера vec. float суммировать будем в double, во избежание потери точности.
//обычное суммирование:
double s = 0; for (auto &x: vec) { s += x.field; }; return s;
//суммирование через std::accumulate - длиннее в два раза
return std::accumulate(vec.begin(), vec.end(), double(0), [](double s, const TElem &x) { return s + x.field; });
//при попытке использовать сомнительные или недоступные пока сокращения - всё равно длиннее:
return Sum(vec, [](double s, auto &x) {return s+x.field;}, 0.0);
//если бы не странные ограничения С/C++:
return Sum(vec, ((s, x) -> s + x.field), double(0));
c++