partial_sum

Posted Zhoier

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了partial_sum相关的知识,希望对你有一定的参考价值。

版本1:

template < class InputIterator, class OutputIterator >
OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result)
{
    if ( first == last)
        return result;
    *result = *first;
    return __partial_sum(first, last, result, value_type(first));
}

template <class InputIterator, class OutputIterator, class T>
OutputIterator __parital_sum(InputIterator first, InputIterator last, OutputIterator result, T*)
{
    T value = *first;
    while ( ++first != last)
    {
        value = value + *first;//前n个元素的总和
        *++result = value;//指定给目的端
    }
    return ++result;
}

 

版本2:

template < class InputIterator, class OutputIterator, class BinaryOperation>
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);
}

template <class InputIterator, class OutputIterator, class T, OutputIterator result, T*, BinaryOperation binary_op>
OutputIterator __parital_sum(InputIterator first, InputIterator last, OutputIterator result, T*)
{
    T value = *first;
    while ( ++first != last)
    {
        value = binary_op ( value, *first);
        *++result = value;
    }
    return ++result;
}

  算法partial_sum用来计算局部总和。他会将 *first 赋值给 *result,将 *first 和 *(first+1) 的和赋值给 * (result + 1),以此类推。注意,result可以等于 first,这使我们得以完成就地计算。在这种情况下它是一个质变算法。

  

  运算中的总和首先初始为 *first,然后赋值给 *result 。对于[first,last) 中每个迭代器 i ,从头至尾依序执行sum = sum + *i  (第一版本)或 sum = binary_op(sum, *i)(第二版本),然后再将sum赋值给 *(result+( i - first))。此式所用之二元仿函数不必满足交换律和结合律。所有运算行为的顺序都有明确设定。

  

  本算法返回输出区间的最尾端位置:result + ( last - first )。

  

  如果加法与减法的定义一如常规定义,那么 partial_sum 与先前介绍过的 adjacent_difference 互为逆运算。这里的意思是,如果对区间值1,2,3,4,5执行parital_sum,获得的结果为1,3,6,10,15,再对此结果执行adjacent_difference,便会获得原始区间值1,2,3,4,5。

以上是关于partial_sum的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器