zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    post请求返回404
    启动网关服务报错 Unable to find GatewayFilterFactory with name RequestRateLimiter
    数据库远程连接linux报错2003 can't connect to MySQL server on ip (0) 防火墙没有开放端口3306
    idea下maven项目打包部署到tomcat服务器
    修改Idea背景色
    20种源代码测试工具
    作为一名测试工程师,需要具备哪些能力
    Android自动化测试工具——monkey简介及入门
    appium关于定位元素
    appium testcase2
  • 原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8324287.html
Copyright © 2011-2022 走看看