stl 數值演算法
阿新 • • 發佈:2018-12-19
一.累加和函式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; }