STL之partial_sum
2015-09-12 11:03
330 查看
需要的头文件:
numeric
源码:
作用:
计算局部总和,存储第一元素的值,然后计算第n个元素与前n-1个元素的总和。
通过二元仿函数我们可以取代 operator+
例子:
注意:
如果减法和加法的定义一如常规定义,那么partial_sum与之前介绍过的adjacent_difference互为逆运算。这里的意思是,如果对区间1,2,3,4,5做partial_sum,获得结果1,3,6,10,15,再对此做adjacent_different,便会获得原始区间值1,2,3,4,5
numeric
源码:
//版本1 template <class _InputIterator, class _OutputIterator, class _Tp> _OutputIterator __partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp*) { _Tp __value = *__first; while (++__first != __last) { __value = __value + *__first; *++__result = __value; } return ++__result; } 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)); } //版本2 template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOperation> _OutputIterator __partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp*, _BinaryOperation __binary_op) { _Tp __value = *__first; while (++__first != __last) { __value = __binary_op(__value, *__first); *++__result = __value; } return ++__result; } 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); }
作用:
计算局部总和,存储第一元素的值,然后计算第n个元素与前n-1个元素的总和。
通过二元仿函数我们可以取代 operator+
例子:
#include <numeric> #include <functional> #include <vector> #include <iterator> #include <iostream> #include <algorithm> using namespace std; int main() { int ia[5] = { 1,2,3,4,5 }; vector<int> iv(ia, ia + 5); //作为输出 ostream_iterator<int> oiter(cout, " "); //计算局部总和 partial_sum(begin(iv), end(iv), oiter); //1 3 6 10 15 ( 第n个新元素是前n个旧元素的相加总计 ) cout << endl; //计算局部阶乘 partial_sum(begin(iv), end(iv), oiter,[](int a, int b) { return a*b; }); // 1 2 6 24 120 cout << endl; //计算斐波那契数列 vector<int> fac = {1,1}; int loop = 20; cout << fac[0] << endl; while (loop-- > 0) { partial_sum(begin(fac), end(fac), begin(fac), [&](int a, int b) { swap( fac[0], fac[1] ); return a+b; }); cout << fac[0] << endl; } //fac: 1 1 //fac: 1 2 swap-> 2 1 //fac: 2 3 swap-> 3 2 //fac: 3 5 swap-> 5 3 //fac: 5 8 swap-> 8 5 //fac: 8 13 swap-> 13 8 //fac: ...... return 0; }
注意:
如果减法和加法的定义一如常规定义,那么partial_sum与之前介绍过的adjacent_difference互为逆运算。这里的意思是,如果对区间1,2,3,4,5做partial_sum,获得结果1,3,6,10,15,再对此做adjacent_different,便会获得原始区间值1,2,3,4,5
相关文章推荐
- c++文件读写
- JPA字段映射(uuid,日期,枚举,@Lob)
- jquery发送手机 验证码倒计时插件 支持页面刷新
- php查找字符是否存在
- redo block header
- 面试常见题
- 《剑指offer》两个链表的第一个公共结点
- Hello 51
- Java HelloWorld
- 如何让Win10开机进入平板模式?开机进入平板模式的方法
- SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意
- Leetcode_232_Implement Queue using Stacks
- log4j additivity 作用
- eclipse上,生产可执行的JAR
- unity调用android原生接口
- lintcode-交错正负数-144
- 【无源汇的上下界网络流】【模板】
- Lettcode_232_Implement Queue using Stacks
- redis集群安装问题
- 链表的逆序