accumulate是一种定义在<numeric>头文件里面的一个关于计算范围内元素和的算法。而这个求和的方式有2种:一种是重载,operator +;另外一种是通过二元函数去求和。下面是2种方法的定义:
template<class _InIt,class _Ty> inline
_Ty accumulate(_InIt _First,_InIt _Last, _Ty _Val);
template<class _InIt, class _Ty, class _Fn2> inline
_Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func);
参数说明:
_First,_Last 表示需求和的元素的范围(此参数类型为迭代器类型,必须要满足迭代器特性)
_Val 表示和的初始值,可为0
_Func 被使用的二元函数对象。
两种方式的函数可能实现:
template<class _InIt,class _Ty> inline
_Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val)
{ // return sum of _Val and all in [_First, _Last)
return (_STD accumulate(_First, _Last, _Val, plus<>()));
}
template<class _InIt,class _Ty,class _Fn2> inline
_Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func)
{ // return sum of _Val and all in [_First, _Last), using _Func
for (; _First != _Last; ++_First)
_Val = _Func(_Val, *_First);
return (_Val);
}
这中间有个小插曲,就是 第一种实现用了std::plus 这个模版结构体(注意:plus是模版结构体)。这个模版算法比较有意思,顾名思义,这是一个功能为“相加”的算法,等同于 “operator +”。std::plus的实现如下:
template<>
struct plus<void>
{ // transparent functor for operator+
template<class _Ty1,class _Ty2>
auto operator()(_Ty1&& _Left, _Ty2&& _Right) const
-> decltype(static_cast<_Ty1&&>(_Left)
+ static_cast<_Ty2&&>(_Right))
{ // transparently apply operator+ to operands
return (static_cast<_Ty1&&>(_Left)
+ static_cast<_Ty2&&>(_Right));
}
};
纵观这个结构体,有个很特殊的关键字 decltype;在c++种 这个关键字是用来做推导算法的,在这里,这个结构体是通过推导参数的类型进行计算的。所以,重点来了:
std::accumulate 这个被用作计算的模版算法,不仅仅可以用作“数学意义”上的计算,还可以用来计算 字符串string等数据结构(此数据结构必须有迭代器)。这一点往往会被忽略。