STL源码剖析之数值算法<numeric.h>
2017-03-08 15:41
429 查看
一、accumulate
作用:初始化init,对区间[first,last)的迭代器i执行init += *i或init = binaryop(init,*i)。
作用:初始化init,对区间[first1,last1)和[first2,first2+(last1-first1))的两个迭代器i和j执行init += *i**j或init = binaryop1(init,binaryop1(*i,*j))。
作用:局部计算总和,*first赋值给*result,*first+*(first+1)赋值给*(result+1),依次类推,直至first==last。原始序列为[1,2,3,4,5],执行后得到[1,3,6,10,15]。
作用:计算相邻元素的差。原始序列为[1,2,3,4,5],执行partial_num后得到[1,3,6,10,15],再执行adjacent_difference后得到[1,2,3,4,5]。
作用:指定元素的n次方
作用:设定某个区间内容
作用:初始化init,对区间[first,last)的迭代器i执行init += *i或init = binaryop(init,*i)。
template <class _InputIterator, class _Tp>//版本1,用来计算init和[first,last)区间元素的总和 _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init) { for ( ; __first != __last; ++__first) __init = __init + *__first; return __init; } template <class _InputIterator, class _Tp, class _BinaryOperation>//版本2,对迭代器中每一个元素时执行二元操作 _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op) { for ( ; __first != __last; ++__first) __init = __binary_op(__init, *__first); return __init; }二、inner_product
作用:初始化init,对区间[first1,last1)和[first2,first2+(last1-first1))的两个迭代器i和j执行init += *i**j或init = binaryop1(init,binaryop1(*i,*j))。
template <class _InputIterator1, class _InputIterator2, class _Tp>//版本1,两个迭代器元素的内积 _Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) { for ( ; __first1 != __last1; ++__first1, ++__first2) __init = __init + (*__first1 * *__first2); return __init; } template <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2> //版本2,两个迭代器的二元操作,提供operator+和operator* _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; }三、partial_num
作用:局部计算总和,*first赋值给*result,*first+*(first+1)赋值给*(result+1),依次类推,直至first==last。原始序列为[1,2,3,4,5],执行后得到[1,3,6,10,15]。
template <class _InputIterator, class _OutputIterator, class _Tp> _OutputIterator __partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp*) { _Tp __value = *__first; while (++__first != __last) { __value = __value + *__first; *++__result = __value;//记录每次两个元素相加的值 } return ++__result; } template <class _InputIterator, class _OutputIterator>//版本1 _OutputIterator partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result) { if (__first == __last) return __result;//没有元素返回空 *__result = *__first;//*first赋值给result第一个元素 return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first));//result从第二个元素开始记录两两相加的结果 } template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOperation> _OutputIterator __partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp*, _BinaryOperation __binary_op) { _Tp __value = *__first; while (++__first != __last) { __value = __binary_op(__value, *__first);//两两元素执行二元操作 *++__result = __value; } return ++__result; } template <class _InputIterator, class _OutputIterator, class _BinaryOperation>//版本2 _OutputIterator partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryOperation __binary_op) { if (__first == __last) return __result; *__result = *__first; return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first), __binary_op); }四、adjacent_difference
作用:计算相邻元素的差。原始序列为[1,2,3,4,5],执行partial_num后得到[1,3,6,10,15],再执行adjacent_difference后得到[1,2,3,4,5]。
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; } template <class _InputIterator, class _OutputIterator>//版本1 _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, 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; } template <class _InputIterator, class _OutputIterator, class _BinaryOperation> _OutputIterator adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryOperation __binary_op) { if (__first == __last) return __result; *__result = *__first; return __adjacent_difference(__first, __last, __result, __VALUE_TYPE(__first), __binary_op); }五、power(SGI专属,不在STL之列)
作用:指定元素的n次方
template <class _Tp, class _Integer> inline _Tp __power(_Tp __x, _Integer __n) { return __power(__x, __n, multiplies<_Tp>());//指定操作为乘法,则为乘幂 } template <class _Tp, class _Integer, class _MonoidOperation>//幂次方 inline _Tp power(_Tp __x, _Integer __n, _MonoidOperation __opr) { return __power(__x, __n, __opr); } template <class _Tp, class _Integer> inline _Tp power(_Tp __x, _Integer __n) { return __power(__x, __n); }六、itoa(SGI专属,不在STL之列)
作用:设定某个区间内容
template <class _ForwardIter, class _Tp> void iota(_ForwardIter __first, _ForwardIter __last, _Tp __value) { while (__first != __last) *__first++ = __value++; }
相关文章推荐
- STL源码剖析 [算法](一)[stl_numeric.h]==>copy
- STL源码剖析学习之数值算法
- STL数值算法<numeric>
- 深度剖析C#序列化和反序列化<转载>
- <算法导论>第九章3 最坏情况线性时间的选择
- 常用算法思想复习之<穷举思想>
- 青涩的回忆:当年的数值面试作品<从原点开始胡思乱想>
- <<深入核心VCL架构剖析>>笔记(1)
- 赵炯<<Linux 0.11内核完全剖析>>P30 MBR程序调试
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate
- [原创]表达式求值:经典算法 <Java版本>
- http://blog.csdn.net/sparkliang/article/details/5279393 <p> 一致性 hash 算法( consistent hashing )
- STL源码剖析之六:算法
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。
- 六度空间理论算法及应用<转>
- 验证视图MAC失败。如果此引用程序由网络场或群集承载,请确保<machineKey>配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerateP>
- <<转>>算法的力量(李开复)
- STL经典算法集锦<一>之list::sort
- 常用算法思想复习之<递归与分治>
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。