C++ C++;从矢量计算总降雨量

C++ C++;从矢量计算总降雨量,c++,algorithm,oop,C++,Algorithm,Oop,我有一个数据集,其中包含了一系列年份中每个月的总降雨量信息。我需要使用每年的月份计算所有年份的总降雨量,并输出相应的年份。使用getter将数据集放入类对象的向量中,允许我提取诸如最高温度的年份和月份之类的信息 ~snip 我不太确定该如何继续谈下去。我是否使用循环12次来计算每年的降雨量?还是有更好的方法继续下去?在我被提名之前,我尝试了很多事情,但都没有成功,所以我要问这个问题 我已成功地从数据集中打印出本月最高降雨量,如下所示: ~snip 使用std::map()。你只需要一个循环

我有一个数据集,其中包含了一系列年份中每个月的总降雨量信息。我需要使用每年的月份计算所有年份的总降雨量,并输出相应的年份。使用getter将数据集放入类对象的向量中,允许我提取诸如最高温度的年份和月份之类的信息

~snip
我不太确定该如何继续谈下去。我是否使用循环12次来计算每年的降雨量?还是有更好的方法继续下去?在我被提名之前,我尝试了很多事情,但都没有成功,所以我要问这个问题

我已成功地从数据集中打印出本月最高降雨量,如下所示:

~snip
使用std::map()。你只需要一个循环

下面是一个在dataVector上迭代的示例

std::map<int,double> result;

for( std::vector<YourDataStruct>::iterator it = dataVector.begin(); it != dataVector.end(); ++it ) {

    if(result.count(it->getYear()) == 0)
        result[it->getYear()] = it->getRain();
    else
        result[it->getYear()] += it->getRain();
}
std::映射结果;
对于(std::vector::iterator it=dataVector.begin();it!=dataVector.end();++it){
if(result.count(it->getYear())==0)
结果[it->getYear()]=it->getRain();
其他的
结果[it->getYear()]+=it->getRain();
}

假设您的数据在一个向量中,并且数据以文件的形式逐年存储,您可以提供一个谓词来逐年在向量中搜索(在C++11中使用lambda或将一元谓词写入函子对象):

double averageRainfall(标准::向量和年份){
/*某一年的第一个记录*/
std::vector::iterator b=std::下限(v.begin(),v.end(),year,
[](持续降雨和恢复){返回(年==年);};
/*1给定年份的过去最后记录*/
std::vector::iterator e=std::上限(v.begin(),v.end(),年份,
[](持续降雨和降雨){return(r.year==年);});
/*计算总数*/
双和=标准::累加(b,e,0.0);
/*平均*/
双平均值=和/标准:距离(b,e);
回归均值;
}


你应该考虑使用一种多键映射,即<代码> STD::MultIMAP < int,STD::vector > <代码>作为一个数据结构来保存你的记录。处理信息会更容易


为您的记录创建一个结构

将文件中的记录读入
std::vector

为每个要索引(排序)的字段创建一个
std::map
。键字段将是表中列的数据类型。大概是这样的:

std::map<double, unsigned int> temperature_index;
std::地图温度指数;
上面示例中的值字段unsigned int将是向量中元素的索引


通过使用多个索引表,您可以按任意顺序引用向量,而无需对向量进行排序。您甚至可以有不同的订购方案

您可以使用将年份作为键值的
std::vector
而不是简单的
std::map
。是否需要考虑循环12次?您尝试了什么但没有成功?老实说,根据您的性能要求,有几种方法可以做到这一点。如果这是一个类,只需执行血腥的for循环。
std::map<double, unsigned int> temperature_index;