版本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的更多相关文章

  1. 一般化数值算法(accumluate,inner_product,partial_sum,adjacent_difference)

    accumulate template<class InputIterator, class T> T accumulate( InputIterator _First, InputIte ...

  2. C++STL 中的数值算法(iota、accumulate、adjacent_difference、inner_product、partial_sum)

    以下算法均包含在头文件 numeric 中 ##1.iota 该函数可以把一个范围内的序列从给定的初始值开始累加 先看用法. 例: 假设我需要一个长度为10,从5开始递增的序列 vector<i ...

  3. UVALive 7141 BombX(离散化+线段树)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  4. C++的STL

    今天,看一段代码的时候发现只一句话就做了个排序,是这样的: sort(rotateArray.begin(),rotateArray.end()); 很震惊,后来查了一下sort的用法, sort函数 ...

  5. Bjarne Stroustrup对C++程序员的忠告

    转自:http://blog.csdn.net/adm_qxx/archive/2007/05/20/1617488.aspx  第1章 致读者  [1] 在编写程序时,你是在为你针对某个问题的解决方 ...

  6. STL---总结

    文章转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/22/2603525.html 一.STL的六大组件 容器(Container),是一种 ...

  7. STL中的算法小结

    ()要运用STL的算法,首先必须包含头文件<algorithm>,某些STL算法用于数值处理,因此被定义于头文件<numeric> ()所有STL算法都被设计用来处理一个或多个 ...

  8. c++模板库(简介)

    目 录 STL 简介 ......................................................................................... ...

  9. C++Primer STL算法

    //1.概览: // A:beg和end是表示元素范围的迭代器. // B:beg2是表示第二个输入序列开始位置的迭代器.end2表示第二个序列的末尾位置,若没有end2,则假定beg2表示的序列至少 ...

随机推荐

  1. instruments symbol name 不显示函数名!

    那是因为instruments找不到编译好的dSYM  其它的什么修改配置都没什么用 最好的办法就是直接删除资源文件APP名. 资源库 -> Developer -> Xcode -> ...

  2. go微服务框架go-micro深度学习-目录

    go微服务框架go-micro深度学习(一) 整体架构介绍 go微服务框架go-micro深度学习(二) 入门例子 go微服务框架go-micro深度学习(三) Registry服务的注册和发现 go ...

  3. Sql Server 增加字段、修改字段、修改类型、修改默认值(转)

    转:http://www.cnblogs.com/pangpanghuan/p/6432331.html Sql Server 增加字段.修改字段.修改类型.修改默认值 1.修改字段名: alter ...

  4. 【C++】C++中的数组

    目录结构: contents structure [-] 一维数组 数组的定义和初始化 数组元素的访问 数组和指针 多维数组 数组是存放相同类型的容器,数组的大小确定不变,不能随意向数组中添加元素.因 ...

  5. Mac NVM 配置

    1.NVM 简介 NVM(node version manager)是一个可以让你在同一台机器上安装和切换不同版本 node 的工具. GitHub 地址 2.NVM 环境配置 2.1 安装 NVM ...

  6. Android内存泄漏杂谈

    内存泄漏:是指内存得不到GC的及时回收,从而造成内存占用过多.从而导致程序Crash,也就是常说的OOM. 一.static 先来看以下一段代码 public class DBHelper { pri ...

  7. python爬虫高级功能

    上一篇文章中我们介绍了爬虫的实现,及爬虫爬取数据的功能,这里会遇到几个问题,比方站点中robots.txt文件,里面有禁止爬取的URL.还有爬虫是否支持代理功能.及有些站点对爬虫的风控措施.设计的爬虫 ...

  8. Python3 字符串前面加u,r,b的含义

    u/U:表示unicode字符串 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码. 一般英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u:但是中文, ...

  9. Visual Studio编辑器“智能提示(IntelliSense)”异常的解决方案

    1.删除工程中的 .suo 文件. 2.重启vs

  10. docker容器里设置中文时区

    本文讨论docker容器里中文时区的问题,总所周知docker hub上的镜像默认都是英文时区的,在国人使用过程当中需要将时区设置成中文,我原来光配置/etc/localtime了date显示的时间也 ...