从矢量计算总降雨量

C++ Calculate total rainfall from a vector

本文关键字:降雨量 计算      更新时间:2023-10-16

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

~snip

我不太确定我应该如何继续这件事。我要把每年的降雨量用循环加12次吗?或者有更好的方式继续谈下去?在我被批评之前,我确实尝试了很多东西,但都不起作用,所以我在这里问。

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

~snip

使用std::map (http://en.cppreference.com/w/cpp/container/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();
}

假设你有你的数据在一个矢量和数据存储在文件中,年复一年,你可以提供一个谓词搜索向量年(使用lambda在c++ 11或写一元谓词作为一个函子对象):

double averageRainfall( std::vector<Rain>& year) {
    /* first record for a given year */
    std::vector<Rain>::iterator b = std::lower_bound( v.begin(), v.end(), year,
                               []( const Rain& r){ return ( r.year == year);});
    /* 1 past last record for a given year */
    std::vector<Rain>::iterator e = std::upper_bound( v.begin(), v.end(), year,
                        []( const Rain& r){ return ( r.year == year);}));
    /* calculate the sum */
    double sum = std::accumulate( b, e , 0.0);
    /* and average */
    double mean = sum / std::distance( b, e);
    return mean;
}

std:: lower_bound


您应该考虑使用某种多键映射,例如std::multimap< int, std::vector<Rain> >作为保存记录的数据结构。这将更容易处理信息。

std::多重映射

为记录创建一个结构。

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

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

std::map<double, unsigned int> temperature_index;

value字段,在上面的例子中是unsigned int,将是vector中元素的索引。

通过拥有多个索引表,您可以以任何您想要的顺序引用vector,而无需对vector进行排序。你甚至可以有不同的排序方案。