Программирование. Принципы и практика использования C++ Исправленное издание, стр. 291
}Тип результата (суммы) совпадает с типом переменной, которую алгоритм
accumulate()void f(int* p,int n){ int s1 = accumulate(p, p+n, 0); // суммируем целые числа в int long sl = accumulate(p, p+n, long(0)); // суммируем целые числа // в long double s2 = accumulate(p, p+n, 0.0); // суммируем целые числа // в double}На некоторых компьютерах переменная типа
longintdoubleint
initvoid f(vector<double>& vd,int* p,int n){ double s1 = 0; s1 = accumulate(vd.begin(),vd.end(),s1); int s2 = accumulate(vd.begin(), vd.end(),s2); // Ой float s3 = 0; accumulate(vd.begin(), vd.end(), s3); // Ой}
accumulate()s2s3accumulate()21.5.2. Обобщение алгоритма accumulate()
Итак, основной алгоритм
accumulate()accumulate()template<class In, class T, class BinOp>T accumulate(In first, In last, T init, BinOp op){ while (first!=last) { init = op(init, *first); ++first; } return init;}Здесь можно использовать любую бинарную операцию, получающую два аргумента, тип которых совпадает с типом аккумулятора. Рассмотрим пример.
array<double,4> a = { 1.1, 2.2, 3.3, 4.4 }; // см. раздел 20.9cout << accumulate(a.begin(),a.end(), 1.0, multiplies<double>());Этот фрагмент кода выводит на печать число 35.1384, т.е. 1.0*1.1*2.2*3.3*4.4 (1.0 — начальное значение). Бинарный оператор
multiplies<double>()multiplies<double>doublemultiplies<int>intplusminusdividesmodulus<functional>
1.0sort()struct Record { double unit_price; int units; // количество проданных единиц // ...};Мы можем поручить какому-то оператору в определении алгоритма
accumulateRecorddouble price(double v,const Record& r){ return v + r.unit_price * r.units; // вычисляет цену // и накапливает итог}void f(const vector<Record>& vr){ double total = accumulate(vr.begin(),vr.end(),0.0,price); // ...