stl 数值算法

一.累加和函数accumulate

       该函数用于累计指定区间的数据,也可以由用户指定操作,而不一定是加法,其实现如下:

// 对区间[first,last)进行加和操作,__init为提供的初始值
template <class _InputIterator, class _Tp> 
_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
{
  for ( ; __first != __last; ++__first)
    __init = __init + *__first;
  return __init;
}

// __binary_op为用户提供的二元操作运算
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;
}

 

二.邻接数据计算函数

1.邻接数据减法adjacent_difference

     该函数用于对相邻的两个数据进行减法操作(后一个数据减去前一个数据),并将结果保留到目的区间,第一个数直接复制到目的区间,当让也可以由用户提供二元操作来代替减法,其实现如下:

template <class _InputIterator, class _OutputIterator>
_OutputIterator adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
{
  if (__first == __last) return __result;
  *__result = *__first;       // 将第一个数据直接拷贝到目的区间
  return __adjacent_difference(__first, __last, __result, __VALUE_TYPE(__first));
}

template <class _InputIterator, class _OutputIterator, class _Tp>
_OutputIterator  __adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp*)
{
  _Tp __value = *__first;
  while (++__first != __last) {
    _Tp __tmp = *__first;
    *++__result = __tmp - __value; // 用后一个元素减去前一个元素,结果放入目的区间
    __value = __tmp;
  }
  return ++__result;
}


// 另一个重载,使用用户提供的二元操作__binary_op
template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
_OutputIterator adjacent_difference(_InputIterator __first, _InputIterator __last, 
_OutputIterator __result, _BinaryOperation __binary_op)
{
  __STL_REQUIRES(_InputIterator, _InputIterator);
  __STL_REQUIRES(_OutputIterator, _OutputIterator);
  if (__first == __last) return __result;
  *__result = *__first;
  return __adjacent_difference(__first, __last, __result,
                               __VALUE_TYPE(__first),
                               __binary_op);
}

template <class _InputIterator, class _OutputIterator, class _Tp,  class _BinaryOperation>
_OutputIterator
__adjacent_difference(_InputIterator __first, _InputIterator __last, 
                      _OutputIterator __result, _Tp*,
                      _BinaryOperation __binary_op) {
  _Tp __value = *__first;
  while (++__first != __last) {
    _Tp __tmp = *__first;
    *++__result = __binary_op(__tmp, __value);
    __value = __tmp;
  }
  return ++__result;
}

 

2.邻接数据加法运算partial_sum

    该函数恰好是adjacent_difference的逆运算,即将前一个元素加到后一个元素上,并将结果保存至目的区间,其实现方法于adjacent_difference类似,此处不再赘述

 

三.内积运算函数inter_product

      对区间[first1,last1)和区间[first2, first2 + last1 - first1)的数据进行内积运算,也可以使用用户指定的两个运算来代器乘法和加法,其实现如下:

template <class _InputIterator1, class _InputIterator2, class _Tp>
_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init)
{
  for ( ; __first1 != __last1; ++__first1, ++__first2)
    __init = __init + (*__first1 * *__first2);
  return __init;
}

// __binary_op1代替加和运算, __binary_op2代替乘法运算
template <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
                  _InputIterator2 __first2, _Tp __init, 
                  _BinaryOperation1 __binary_op1,
                  _BinaryOperation2 __binary_op2)
{
  for ( ; __first1 != __last1; ++__first1, ++__first2)
    __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
  return __init;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值