如果是常规加法和减法定义,若输出迭代器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