STL算法库-数字运算(三)

来源:互联网 发布:节食一个月减肥 知乎 编辑:程序博客网 时间:2024/05/22 01:34
四、通用数值计算
头文件:#include<numeric>

4.1 求和(accumulate)
T accumulate(iterator first,iterator last T val);
计算[first,last]中数字的总和,将该值添加到数值val上.
T accumulate(iterator first,iterator last,T Val, BinaryOperator op);
对序列[first,last]中每个元素,均使用op进行处理,处理后结果依次累加,所得总和再添加到Val上.
op原型:op(Val,*iter),*iter代表序列中每个元素。Val是算法accumulate中的参数Val

示例代码如下:

#include "stdafx.h"#include "iostream"#include "algorithm"#include "numeric"#include "functional"#include "vector"using namespace std;void myprint(int& ele){ cout<<ele<<",";}int myop(int orig,int ele){ return ele*2+orig;}int _tmain(int argc, _TCHAR* argv[]){ vector<int> vt; int dim[]={1,2,3,4,5,6,7,8,9,10,11,12}; vt.assign(dim,dim+12); for_each(vt.begin(),vt.end(),myprint); cout<<endl; int sum=accumulate(vt.begin(),vt.end(),0); cout<<"The sum of vector vt is: "<<sum<<endl; sum=accumulate(vt.begin(),vt.end(),0,myop); cout<<"The sum of vector vt is: "<<sum<<endl; return 0;

4.2 内积(inner_product)
内积通过把第一个序列中的元素和第二个序列中的相同位置的元素相乘,然后把计算的结果相加而得到的。
T inner_product(iterator1 first1,iterator1 last1,iterator2 first2,T val);
计算并返回[first1,last1]区间和以first2为开始的区间对应元素的内积,具体的说对于上述区间的每一个元素调用表达式:val=val+elem1*elem2
T inner_product(iterator1 first1,iterator1 last1,iterator2 first2,T val,pred1 pr1,pred2 pr2)
将[first1,last1]区间和以first2为开始的区间内对应的元素进行pr2运算,然后再和val进行pr1运算,并将结果返回。具体的说针对上述区间的每一个元素调用表达式:val=pr1(val,pr2(elem1,elem2))
示例代码:

#include "stdafx.h"#include "iostream"#include "algorithm"#include "numeric"#include "functional"#include "list"#include "iterator"using namespace std;void myprint(int& ele){ cout<<ele<<",";}int op1(int orig,int ele){ return orig+ele;}int op2(int ele1,int ele2){ return ele1*2+ele2*3;}int _tmain(int argc, _TCHAR* argv[]){ int dim1[]={1,2,3,4,5,6,7,8,9,10,11,12}; int dim2[]={3,4,5,6,7,8,9,10,11,12,13,14}; list<int> l1,l2; copy(dim1,dim1+12,back_inserter(l1)); copy(l1.begin(),l1.end(),ostream_iterator<int>(cout,",")); cout<<endl; copy(dim2,dim2+12,back_inserter(l2)); for_each(l2.begin(),l2.end(),myprint); cout<<endl; int prod=inner_product(l1.begin(),l1.end(),l2.begin(),0); cout<<"the inner_prduct of l1 and l2 is :"<<prod<<endl; prod=inner_product(l1.begin(),l1.end(),l2.begin(),0,op1,op2); cout<<"inner_product of l1 and l2 with function op1 and op2 is:"<<prod<<endl; int sum=0; for (int j=0;j<12;j++) {  sum+=(dim1[j]*2+dim2[j]*3); } cout<<"inner_product of l1 and l2 with function op1 and op2 is:"<<sum<<endl; return 0;}

4.3 部分和(partial_sum)
部分和的求和步骤:首先将原序列的第1个元素赋值给新序列的第1个元素,然后把原序列的前两个元素相加,把结果赋值给新序列的第2个元素,把原序列的前3个元素相加,把结果赋值给新序列的第3个元素,以此类推
outputiterator partical_sum(inputiterator first1,inputiterator last1,outputiterator first2)
求区间[first1,last1]的部分和,然后把结果写入以first2为起点的目标区间
outputiterator partical_sum(inputiterator first1,inputinterator last1,outputiterator first2,BinaryOperator op)
对区间[first1,last1]每个元素都要经过op处理,然后再求部分和,把结果写入到以first2为起点的目标区间
op原型是T op(T pre_ele,T ele),pre_ele是新序列中上一个元素,即原序列中前面元素的累加的和,ele是原序列中对应的元素
示例代码:

#include "stdafx.h"#include "iostream"#include "algorithm"#include "numeric"#include "functional"#include "vector"#include "iterator"using namespace std;void myprint(int& ele){ cout<<ele<<",";}int op(int pre_ele,int ele){ return pre_ele+ele*2;}int _tmain(int argc, _TCHAR* argv[]){ vector<int> v1,v2,v3; int dim[]={1,2,3,4,5,6,7,8,9,10,11,12}; v1.assign(dim,dim+12); cout<<"vector v1:"<<endl; for_each(v1.begin(),v1.end(),myprint); cout<<endl; partial_sum(v1.begin(),v1.end(),back_inserter(v2)); cout<<"vector v2: "<<endl; for_each(v2.begin(),v2.end(),myprint); cout<<endl; partial_sum(v1.begin(),v1.end(),back_inserter(v3),op); cout<<"vector v3: "<<endl; for_each(v3.begin(),v3.end(),myprint); cout<<endl; return 0;}
4.4 序列相邻差(adjacent_difference)
相邻差值的计算步骤是:首先将原序列的第1个元素赋值给新序列的第1个元素,再把源序列的第2个元素减去第1个元素,其结果赋值给新序列的第2个元素;然后把源序列的第3个元素减去第2个元素,并将结果赋值给新序列的第3个元素
outputiterator adjacent_difference(iterator first1,iterator last1,outputiterator first2) 计算[first1,last1]之间的相邻差,并将计算结果保存至以first2为起始的新序列中
outputiterator adjacent_difference(iterator first1,iterator last1,outputiterator first2,BinaryOperator op) 针对源区间[first1,last1]中每个元素和其紧邻的前一个元素调用谓词处理,并将结果写入以first2为起始的目标序列中
示例代码:

#include "numeric"#include "functional"#include "list"#include "iterator"#include "vector"using namespace std;void myprint(int& ele){ cout<<ele<<",";}int op(int ele1,int ele2){ return ele1*5-ele2*3;}int _tmain(int argc, _TCHAR* argv[]){ int dim[]={1,2,3,4,5,6,7,8,9,10,11,12}; vector<int> v1; v1.assign(dim,dim+12); copy(v1.begin(),v1.end(),ostream_iterator<int>(cout,", ")); cout<<endl; vector<int> v2(v1.size()); vector<int>::iterator it; it=adjacent_difference(v1.begin(),v1.end(),v2.begin()); cout<<"v1 is dealt by the algorithm adjacent_difference:"<<endl; for_each(v2.begin(),v2.end(),myprint); cout<<endl; adjacent_difference(v1.begin(),v1.end(),v2.begin(),op); cout<<"v1 is dealt by the algorithm adjacent_difference:"<<endl; for_each(v2.begin(),v2.end(),myprint); cout<<endl; return 0;}

五、全局性数学函数
头文件:
#include<cmath>
#include<cstdlib>
函数:pow()/exp()/sqrt()/log()/log10()/sin()/cos()/tan()/abs()/rand()

0 0