std::accumulate 的2种用法

    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等数据结构(此数据结构必须有迭代器)。这一点往往会被忽略。

转载于:https://my.oschina.net/OkamiLiu/blog/703459

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值