【问题标题】:C++ Calculate total rainfall from a vectorC++ 从向量计算总降雨量
【发布时间】:2014-03-21 17:27:31
【问题描述】:

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

~snip

我不太确定我应该如何继续。我是否使用循环 12 次将每年的降雨量相加?或者有没有更好的方法来解决它?在我被安排之前,我确实尝试了很多东西,但没有成功,所以我在这里问。

我已经设法从数据集中打印了该月的最高降雨量,如下所示:

~snip

【问题讨论】:

  • 您可以使用std::map<int,std::vector<YourDataStruct> > 代替简单的std::vector,它将年份作为键值。
  • 循环12次有什么顾虑吗?您尝试了什么但没有成功?
  • 老实说,根据您的性能要求,有几种方法可以做到这一点。如果这是一个类,只需执行该死的 for 循环。

标签: c++ algorithm oop


【解决方案1】:

使用 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();
}

【讨论】:

    【解决方案2】:

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

    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&lt; int, std::vector&lt;Rain&gt; &gt; 作为保存记录的数据结构。处理信息会更容易。

    std::multimap

    【讨论】:

      【解决方案3】:

      为您的记录创建一个结构。

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

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

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

      上例中的值字段 unsigned int 将是向量中元素的索引。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 2020-05-06
        相关资源
        最近更新 更多