如果你需要处理一个数组的前缀和,或者数组中某一段元素的前缀和,你会怎么做呢?
partial_sum
函数是STL中的函数,用于计算范围的部分和,并从结果开始分配范围中的每个元素,range[first,last)中相应元素的部分和。
头文件
numeric
(需要使用命名空间std)。
声明
C++11中有partial_sum
函数的两种重载:
template<typename _InputIterator, typename _OutputIterator>
_OutputIterator
partial_sum(_InputIterator __first, _InputIterator __last,
_OutputIterator __result)
template<typename _InputIterator, typename _OutputIterator,
typename _BinaryOperation>
_OutputIterator
partial_sum(_InputIterator __first, _InputIterator __last,
_OutputIterator __result, _BinaryOperation __binary_op)
该函数是用模板类写的,因此可以对vector数组进行操作。
函数的参数定义如下:
__first
:迭代到序列中的初始位置(Start of input range)__last
:迭代到序列中的最终位置(End of input range)__result
:记录部分和结果的数组(Output sum)__binary_op
:定义“和”的二元运算(Function object)
在基本的使用中,一般采用第一个重载。
示例
先看普通数组的例子:
#include<iostream>
#include<numeric>
int main()
{
int a[6]={1,1,4,5,1,4};
int res1[6],res2[2];
std::partial_sum(a,a+6,res1);//a[0]~a[5]
for(auto& item : res1)
printf("%d ",item);
putchar('\n');
std::partial_sum(a+1,a+3,res2);//a[1]~a[2]
for(auto& item : res2)
printf("%d ",item);
return 0;
}
运行结果:
需要注意的是,如果想计算到a[i]
处的部分和,__last
参数必须传入a+i+1
。
vector数组的例子:
#include<iostream>
#include<numeric>
#include<vector>
using namespace std;
int main()
{
vector<int> v={2,0,2,4,2,2};
vector<int> res(6);
partial_sum(v.begin(),v.end(),res.begin());
for(auto& item : res)
printf("%d ",item);
return 0;
}
运行结果: