STL:accumulate与自定义数据类型

C++ STL中有一个通用的数值类型计算函数— accumulate(),可以用来直接计算数组或者容器中C++内置数据类型,例如:
#include <numeric>
int arr[]={10,20,30,40,50};
vector<int> va(&arr[0],&arr[5]);
int sum=accumulate(va.begin(),va.end(),0);  //sum = 150

但是对于自定义数据类型,我们就需要自己动手写一个类来实现自定义数据的处理,然后让它作为accumulate()的第四个参数,accumulate()的原型为(文件取自DEV-C++编译器):

template<typename _InputIterator, typename _Tp, typename _BinaryOperation>
 _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
            _BinaryOperation __binary_op)
 {
     // concept requirements
     __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    __glibcxx_requires_valid_range(__first, __last);
 
    for ( ; __first != __last; ++__first)
       __init = __binary_op(__init, *__first);
    return __init;
 }

第四个参数为 __binary_op ,我们需要重写这个函数对象,后面还会继续分析...

假设自定义数据类型为:

struct Student
{
      string name;   // 学生姓名
       int total;      // 四级分数
};
那么我们可能要定义如下列的类:
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <string>
using namespace std;

struct Student
{
       string name;
       int total;
};

class PS{
 public:
        int operator()(int t1,const Student& t2)
        {
            return (t1 + t2.total);
        }
        
};

int main()
{
    Student student[3]={
            {"hicjiajia",10},
            {"sijikaoshi",20},
            {"what",40}
            };
    
    int sum=accumulate(&student[0],&student[3],0,PS());
    cout<<sum<<endl;
    
    system("pause");
    return 0;
}


你可能感兴趣的:(STL:accumulate与自定义数据类型)