c++ - 对象数组的特定成员的总和

标签 c++ sum member

这是我在这里的第一个问题,所以希望这是一个很好的问题(我已经搜索了答案,但还没有找到)。

我有一个用 C++ 编写的基于事件的疾病模型,我正在尝试将其转换为 OOP(部分是为了我自己的学习经验)。基本类 (Herd) 存储易感、感染和耐药动物的数量,以及可能事件发生的速率。

class Herd {  
    private: 
        int S,I,R,N;  
        float birth, death, infection, recovery, movement;  
    public:  
        void calc_birth(void) { birth = r*N*(1.0-N/c); }  
        void calc_infection(void) { infection = N>0 ? beta*S*I/N : 0.0; }  
        // etc.
};  

然后我有一个牛群的 vector 来跟踪。在整个模型中,我需要计算所有牛群中每个成员的总和,在事件改变牛群中个体的数量或类别后(这种情况经常发生)。我已经有 4 个类别和 5 个事件,这个模型可以很容易地扩展并且需要更多。

在我以前的程序代码中,我只是为每个成员提供了一个单独的 vector ,并且很容易创建一个 sum() 函数来计算结果,但我看不到如何用一个类来做到这一点,而不用为每个成员编写一个单独的求和函数(这是可能的,但我怀疑这是一个特别好的方法)。我可以创建一个静态成员(例如 sum_S)来跟踪总数,并在每次事件发生时更新它,但这可能并不适合所有成员,而且我不确定总数是否可能在谈到利率时,不要慢慢偏离真实值(value)。

有没有一种方法可以编写单个 sum() 函数,它将我想要的成员作为参数,并返回所有牛群中该特定成员的总和?

谢谢!

最佳答案

标准库 header numeric 包含函数accumulate .它并不完全符合您的要求,但很容易适应:

#include <numeric>
#include <vector>
#include <iostream>

struct Foo {
  int member;
};


int main()
{
  std::vector<Foo> v = { {1}, {2}, {3} };

  int sum 
    = std::accumulate(begin(v), end(v), 0,
                      // lambda that sums up
                      [](const int& x, const Foo& y)
                      {return x + y.member;});
  std::cout << sum << std::endl;

  return 0;
}

该代码使用 initializer_lists 和 lambda。如果您的编译器不支持这些,请使用相应的 C++03 代码(push_back 和仿函数)。

关于c++ - 对象数组的特定成员的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16561266/

相关文章:

mysql - mysql中如何选择最大的值之和

java - 如何使方法不修改变量

c++ - 使用 iostreams 读取文件的一部分

c++ - 如何制作模板结构 vector

java - 使用递归求和

c# - 计算一个、两个和三个连续项目的总和的更好方法

c++ - 高效删除文件 Windows C++

c++ - 如何在带有CRTP模式的派生类中使用聚合初始化?

c++ - C++中的二叉搜索树复制构造函数

c++ - CURLOPT_WRITEFUNCTION 指向成员函数的指针