1. 程式人生 > >stl 數值演算法

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;
}