先看个小实例:
#include<iostream>
#include<numeric>
#include<vector>
#include<functional>
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;
cout<<accumulate(iv.begin(),iv.end(),o,minus<int>())<<endl;
//-15 0-1- 2- 3- 4- 5
}
看看accumulate的源码:
第一个版本的accumulate:
template<class InputIterator, class T>
T accumulate(InputIterator first,InputIterator last,T init){
for( ; first!=last; ++first)
init=init+ *first;
return init;
}
第二版本的accumulate:
template<class InputIterator, class T, BinaryOperation>
T accumulate(InputIterator first, InputIterator last,T init,BinaryOperation binary_op){
for( ; first != last; ++first)
init=binary_op(init, *first);
return init;
}
算法accumulate用来计算init和[first,last)内所有元素的总和。注意,你一定得提供一个初始值init, 这么做的原因之一是当[first,last)为空区间时,仍能获得一个明确定义的值。如果要用accumulate计算区间内所有数值的和,应将init设为0;