STL源码剖析(十八)数值算法<stl_numeric.h>

如果是常规加法和减法定义,若输出迭代器result等于输入迭代器first,这种情况下adjacent_difference与partial_sum为质变算法,且互为逆运算。

namespace std _GLIBCXX_VISIBILITY(default)
{
  template<typename _ForwardIterator, typename _Tp> //质变算法
    void //设定区间内元素从__value开始呈递增状态
    iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value)
    {
      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
				  _ForwardIterator>)
      __glibcxx_function_requires(_ConvertibleConcept<_Tp,
	    typename iterator_traits<_ForwardIterator>::value_type>)
      __glibcxx_requires_valid_range(__first, __last);

      for (; __first != __last; ++__first)
	  {
		  *__first = __value;
		  ++__value;
	  }
    }
} // namespace std

namespace std _GLIBCXX_VISIBILITY(default)
{
  template<typename _InputIterator, typename _Tp> //模板函数,模板参数为输入迭代器和数据类型
    inline _Tp //计算init和[first, last)内所有元素的总和,返回数据类型
    accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
    {
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
      __glibcxx_requires_valid_range(__first, __last);

      for (; __first != __last; ++__first)
		__init = __init + *__first; //将每个元素的值累加到初值init上
      return __init; //提供初始值,当[first, last)为空时可有一个明确定义的值
    }
 
  template<typename _InputIterator, typename _Tp, typename _BinaryOperation>
    inline _Tp
    accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
	       _BinaryOperation __binary_op)
    {
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
      __glibcxx_requires_valid_range(__first, __last);

      for (; __first != __last; ++__first)
		__init = __binary_op(__init, *__first); //对每个元素执行二元操作
      return __init;
    }
  //执行两个序列的一般内积
  template<typename _InputIterator1, typename _InputIterator2, typename _Tp>
    inline _Tp
    inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
		  _InputIterator2 __first2, _Tp __init)
    {
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
      __glibcxx_requires_valid_range(__first1, __last1);

      for (; __first1 != __last1; ++__first1, (void)++__first2) //以序列1进行循环
		__init = __init + (*__first1 * *__first2); //计算两个序列一般内积
      return __init;
    }
  //先计算两序列的二元操作,再将执行结果与初如值执行另一个二元操作,最后赋给初始值返回最终结果
  template<typename _InputIterator1, typename _InputIterator2, typename _Tp,
	   typename _BinaryOperation1, typename _BinaryOperation2>
    inline _Tp
    inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
		  _InputIterator2 __first2, _Tp __init,
		  _BinaryOperation1 __binary_op1,
		  _BinaryOperation2 __binary_op2)
    {
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
      __glibcxx_requires_valid_range(__first1, __last1);

      for (; __first1 != __last1; ++__first1, (void)++__first2) //执行序列1的循环
		__init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); //执行两种二元操作
      return __init;
    }
  //计算局部总和,输入迭代器前n个元素和赋值给输出迭代器第n个元素
  template<typename _InputIterator, typename _OutputIterator>
    _OutputIterator
    partial_sum(_InputIterator __first, _InputIterator __last,
		_OutputIterator __result)
    {
      typedef typename iterator_traits<_InputIterator>::value_type _ValueType; //输入迭代器所指元素类型
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
      __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
				                         _ValueType>)
      __glibcxx_requires_valid_range(__first, __last);

      if (__first == __last)
		return __result;
      _ValueType __value = *__first;
      *__result = __value; //记录第一个元素
      while (++__first != __last)
	  {
		  __value = __value + *__first;
		  *++__result = __value; //迭代器+1,result[i]等于输入迭代器前i个元素总和
	  }
      return ++__result;
    }
  //输入迭代器前n个元素执行二元操作赋值给输出迭代器第n个元素
  template<typename _InputIterator, typename _OutputIterator,
	   typename _BinaryOperation>
    _OutputIterator
    partial_sum(_InputIterator __first, _InputIterator __last,
		_OutputIterator __result, _BinaryOperation __binary_op)
    {
      typedef typename iterator_traits<_InputIterator>::value_type _ValueType; //输入迭代器所指元素类型
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
      __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
				                         _ValueType>)
      __glibcxx_requires_valid_range(__first, __last);

      if (__first == __last)
		return __result;
      _ValueType __value = *__first;
      *__result = __value; //记录第一个元素
      while (++__first != __last)
	  {
		  __value = __binary_op(__value, *__first); //第i次操作结果与第i+1个元素执行二元操作
		  *++__result = __value; //操作结果赋值输出第i+1个元素
	  }
      return ++__result;
    }
  //计算[first, last)中相邻元素的差额
  template<typename _InputIterator, typename _OutputIterator> //模板参数输入迭代器和输出迭代器
    _OutputIterator //返回类型为模板参数类型
    adjacent_difference(_InputIterator __first,
			_InputIterator __last, _OutputIterator __result)
    {
      typedef typename iterator_traits<_InputIterator>::value_type _ValueType; //输入迭代器所指元素类型
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
      __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
				                         _ValueType>)
      __glibcxx_requires_valid_range(__first, __last);

      if (__first == __last)
		return __result; //输入迭代器为空,直接返回__result
      _ValueType __value = *__first;
      *__result = __value; //记录第一个元素
      while (++__first != __last)
	  {
		  _ValueType __tmp = *__first;
		  *++__result = __tmp - __value; //迭代器前进+1,将相邻两元素的差值,赋值给目的端
		  __value = _GLIBCXX_MOVE(__tmp);
	  }
      return ++__result;
    }
  //记录相邻两元素二元操作的结果
  template<typename _InputIterator, typename _OutputIterator,
	   typename _BinaryOperation> //模板参数二元仿函数
    _OutputIterator
    adjacent_difference(_InputIterator __first, _InputIterator __last,
			_OutputIterator __result, _BinaryOperation __binary_op)
    {
      typedef typename iterator_traits<_InputIterator>::value_type _ValueType; //输入迭代器所指元素类型
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
      __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
				                         _ValueType>)
      __glibcxx_requires_valid_range(__first, __last);

      if (__first == __last)
		return __result;
      _ValueType __value = *__first;
      *__result = __value; //记录第一个元素
      while (++__first != __last)
	  {
		  _ValueType __tmp = *__first;
		  *++__result = __binary_op(__tmp, __value); //迭代器前进+1,对相邻元素执行二元操作并赋值给目的端
		  __value = _GLIBCXX_MOVE(__tmp);
	  }
      return ++__result;
    }
} // namespace std
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值