计算几个数的n次方和
#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
int sumsquares(int total, int value)
{return total+value*value;
}template<class T>//模板
void printinterval(T first,T last)
{//输出区间[first,last)中的元素 for(;first!=last;++first)cout<<*first<<" ";cout<<endl;
}
template<class T>//类模板
class sumpowers//求区间多少次方的和
{private:int power; public:sumpowers(int p):power(p){}const T operator()(const T &total,const T &value){//计算value的power次方,加到total上 T v=value;for(int i=0;i<power-1;++i)//v乘power-1次 v=v*value;return total + v;}
} ;
int main()
{const int sze =10;int a1[]={1,2,3,4,5,6,7,8,9,10};vector<int>v(a1,a1+sze);//用a1数组初始化v cout<<"1)";printinterval(v.begin(),v.end());int result = accumulate(v.begin(),v.end(),0,sumsquares);cout<<"2)平方和: "<<result<<endl;result=accumulate(v.begin(),v.end(),0,sumpowers<int>(3));cout<<"3)立方和: "<<result<<endl;result= accumulate(v.begin(),v.end(),0,sumpowers<int>(4));cout<<"4)4次方和: "<<result;return 0;/**1)1 2 3 4 5 6 7 8 9 102)平方和: 3853)立方和: 30254)4次方和: 25333**/
}
分析一下accumulate
int result = accumulate(v.begin,v.end(),0,sumsquares);int accumulate(vector<int>::iterator first,vector<int>::iterator last,int init,int(*op)(int,int))//与函数名相匹配,函数指针
{for( ;first!=lats;++first)init =op(init,*first);//调用sumsquares return init;
}int result = accumulate(v.begin,v.end(),0,sumpowers<int>(3));//op的powe成员变量是3 op是一个函数对象 int accumulate(vector<int>::iterator first,vector<int>::iterator last,int init,sumpowers<int>op )
{for( ;first!=lats;++first)init =op(init,*first);//调用()并把power初始化为三 return init;
}accumulate(vector<int>::iterator first,vector<int>::iterator last,int init,binaryop)//binaryop对应的实参可以使函数名,函数指针 ,函数对象
好处
如果没有函数对象,那求不同的立方和都要写一个函数,或者定义一个全局变量,但这样独立性不好,而函数对象完美解决这个问题