STL之accumulate

需要的头文件:
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是第一个参数,务必注意,否则会出现一些神奇的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值