需要的头文件:
numeric
源码:
//版本1
template <class _InputIterator, class _Tp>
_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
{
for ( ; __first != __last; ++__first)
__init = __init + *__first;
return __init;
}
//版本2
template <class _InputIterator, class _Tp, class _BinaryOperation>
_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
_BinaryOperation __binary_op)
{
for ( ; __first != __last; ++__first)
__init = __binary_op(__init, *__first);
return __init;
}
作用:
计算init和[first,last)内所有元素的总和。
通过二元仿函数我们将其一般化为:
计算init和[first,last)内所有每个元素运算值的总和。
例子:
//请使用比较完整支持c++11特性的编译器进行编译
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
int main()
{
int ia[5] = {1,2,3,4,5};
vector<int> iv( ia, ia+5 );
//计算总和
cout << accumulate( iv.begin(), iv.end(), 0 ) <<endl;
//15, 0 + 1 + 2 + 3 + 4 + 5
//计算2倍总和
cout << accumulate( iv.begin(), iv.end(), 0,[](int init, int b){return init + 2*b;}) <<endl;
//30, 0 + 1*2 + 2*2 + 3*2 + 4*2 + 5*2
//计算偶数的总和
cout << accumulate( iv.begin(), iv.end(), 0, [](int init, int b)
{
if( b % 2 == 0 )
return init+b;
return init;
} ) << endl;
//6, 0 + 2 + 4
//计算相乘,注意init的值需要为1
cout << accumulate( iv.begin(), iv.end(), 1, [](int init, int b)
{
return init * b;
} ) <<endl;
//120, 1 * 1 * 2 * 3 * 4 *5
//计算方差
double ave = accumulate( iv.begin(), iv.end(), 0.0 ) / iv.size();
auto variance = accumulate( iv.begin(), iv.end(),0.0, [&](double init, int b)
{
return init + (b-ave)*(b-ave);
} );
variance /= iv.size();
cout << variance << endl;
}
注意:
init的类型决定了accumulate的返回类型。
在使用二元仿函数时,init是第一个参数,务必注意,否则会出现一些神奇的结果