• <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++编译器):

    1 template<typename _InputIterator, typename _Tp, typename _BinaryOperation>
    2 _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
    3 _BinaryOperation __binary_op)
    4 {
    5 // concept requirements
    6   __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    7 __glibcxx_requires_valid_range(__first, __last);
    8
    9 for ( ; __first != __last; ++__first)
    10 __init = __binary_op(__init, *__first);
    11 return __init;
    12 }

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

    假设自定义数据类型为:

    struct Student
    {
    string name; // 学生姓名
    int total; // 四级分数
    };

    那么我们可能要定义如下列的类:

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

    };

    注意,在类中我们重写了operator(),其中第一参数是int类型,第二个参数是const Student& 类型,为什么第一个参数是int类型呢?我们看一下accumulate()函数的原型,accumulate()函数会将其第三个参数(也就是初始化元素,本例为int类型,因为Student结构中的累加值total为int型),第四个参数为一个指针,会一次遍历容器中的每一个元素,用以实现和前面元素的累加。

    完整代码如下:

    #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;
    }

    以前学编程都是用int类型,那只是理论,而实际编程会遇到各种各样的数据,从实践中我学到了不少~~ 吼吼...

  • 相关阅读:
    巧用 Patch Connect Plus 简化 Intune 第三方更新管理
    如何应对薄弱的企业安全意识
    Jira可视化数据分析解决方案
    终端安全:保护企业的关键
    为什么需要ITIL服务目录
    防抖、节流函数封装(站在巨人的肩膀上)
    vue服务器渲染--NUXT
    函数防抖,函数节流(站在巨人的肩膀上)
    MAC地址和IP地址的区别和联系(站在巨人的肩膀上)
    ES8新特性(2017)-- async/await详细介绍与使用
  • 原文地址:https://www.cnblogs.com/hicjiajia/p/1912218.html
Copyright © 2020-2023  润新知