C++ 具有相似索引的值之和

C++ 具有相似索引的值之和,c++,c++11,io,C++,C++11,Io,假设我在一个文本文件中有一组1000个统计数据。其中第一列表示索引的数量,第二列表示索引的值。索引可以重复,相应的值可以不同。我想计算索引的出现次数以及每个索引的值之和 我编写了一个代码,它给出了索引出现的结果,但没有给出相应的值之和 示例 假设我的文本文件有这样一组数据- #index value 4 0.51 5 0.13 5 0.53 5 0.25 6 0.16 6 0.16 7 0.38

假设我在一个文本文件中有一组1000个统计数据。其中第一列表示索引的数量,第二列表示索引的值。索引可以重复,相应的值可以不同。我想计算索引的出现次数以及每个索引的值之和

我编写了一个代码,它给出了索引出现的结果,但没有给出相应的值之和

示例

假设我的文本文件有这样一组数据-

#index   value
  4      0.51
  5      0.13
  5      0.53
  5      0.25
  6      0.16
  6      0.16
  7      0.38
  4      0.11
  3      0.101
  4      0.32
  4      0.2 ... and more
所以在这种情况下-

指数4出现了4次,相应的值之和=(0.51+0.11+0.32+0.2)=1.14

同样地

指数5出现了两次,值的和=(0.13+0.53)=0.66等

我的代码

这是我的密码-

#include <iostream>
#include <map>
#include <fstream>

using namespace std;


int main()
{
    map<double,double>   index;
    double  number,value;
    double total;


    ifstream theFile ("a1.txt");
    while(theFile >> number >> value)
    {
        ++index[number];
        total +=value;
    }
    cout<<"index\t occurs\t total"<<endl;


    for(auto loop = index.begin(); loop != index.end();++loop)
    {
         cout << loop->first << "\t  " << loop->second << "\t \t "<< total<<endl;
    }
    return 0;
}
虽然发生的次数是正确的,但是

总+=价值


不生成我正在寻找的输出。如何获得每个索引的总和

对于每个索引,您将
添加到
总计
,而对于每个索引,您需要单独的
总计

将索引映射到与之匹配的值向量是最简单的,因此您可以在单独的步骤中为每个索引求和

阅读循环的主体可以是

index[ number ].push_back( value );
然后循环索引中的所有条目,生成其关联向量中元素的总和。(提示-
accumulate
是一个常见的名称……)


编辑:哦,计数显然是每个向量中的元素数。

您正在为每个索引向
总计添加
,而您需要为每个索引单独添加
总计

将索引映射到与之匹配的值向量是最简单的,因此您可以在单独的步骤中为每个索引求和

阅读循环的主体可以是

index[ number ].push_back( value );
然后循环索引中的所有条目,生成其关联向量中元素的总和。(提示-
accumulate
是一个常见的名称……)

编辑:哦,计数显然是每个向量中的元素数

  • 您需要每个索引的
    总数
    
    
  • 您需要对每个索引进行计数 简单的解决方案是使用以下结构:

    struct per_index
    {
       int count;
       double total;
       per_index(): total(0), count(0) {}
    };
    
    std::map<int, per_index> index;
    
    ...
    
    index[number].count++;
    index[number].total += value;
    
    struct per_索引
    {
    整数计数;
    双倍总数;
    per_index():总计(0),计数(0){
    };
    地图索引;
    ...
    索引[编号]。计数++;
    索引[编号]。总计+=数值;
    
    请注意,我不认为你读到的
    数字应该(或需要)是
    双倍的
    ,它只会让生活变得更复杂,因为
    双倍的
    在比较平等方面有困难。所以我选择了
    number
    作为
    int
    ——您需要更改代码中的声明

  • 您需要每个索引的
    总数
    
    
  • 您需要对每个索引进行计数 简单的解决方案是使用以下结构:

    struct per_index
    {
       int count;
       double total;
       per_index(): total(0), count(0) {}
    };
    
    std::map<int, per_index> index;
    
    ...
    
    index[number].count++;
    index[number].total += value;
    
    struct per_索引
    {
    整数计数;
    双倍总数;
    per_index():总计(0),计数(0){
    };
    地图索引;
    ...
    索引[编号]。计数++;
    索引[编号]。总计+=数值;
    

    请注意,我不认为你读到的
    数字应该(或需要)是
    双倍的
    ,它只会让生活变得更复杂,因为
    双倍的
    在比较平等方面有困难。因此,我选择了
    number
    作为
    int
    -您需要更改代码中的声明。

    您的总数当前只计算整个文件中的总数,而不是每个索引的总数。与累加“occurs”列的方式类似,您希望累加“total”列。请参见下面修改的代码:

    #include <iostream>
    #include <map>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
        map<double, double> index;
        double number, value;
        map<double, double> total;
    
        ifstream theFile ("a1.txt");
        while(theFile >> number >> value)
        {
            ++index[number];
            total[number] += value;
        }
    
        cout << "index\t occurs\t total" << endl;
        for(auto loop = index.begin(); loop != index.end();++loop)
        {
            cout << loop->first << "\t  " << loop->second << "\t \t "<< total[loop->first] << endl;
        }
        return 0;
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    int main()
    {
    地图索引;
    双数、双值;
    总图;
    ifstream文件(“a1.txt”);
    while(文件>>编号>>值)
    {
    ++索引[编号];
    总[数量]+=数值;
    }
    
    cout您的总计当前只计算整个文件中的总计,而不是每个索引的总计。与累加“occurs”列的方式类似,您希望累加“total”列。请参阅下面修改的代码:

    #include <iostream>
    #include <map>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
        map<double, double> index;
        double number, value;
        map<double, double> total;
    
        ifstream theFile ("a1.txt");
        while(theFile >> number >> value)
        {
            ++index[number];
            total[number] += value;
        }
    
        cout << "index\t occurs\t total" << endl;
        for(auto loop = index.begin(); loop != index.end();++loop)
        {
            cout << loop->first << "\t  " << loop->second << "\t \t "<< total[loop->first] << endl;
        }
        return 0;
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    int main()
    {
    地图索引;
    双数、双值;
    总图;
    ifstream文件(“a1.txt”);
    while(文件>>编号>>值)
    {
    ++索引[编号];
    总[数量]+=数值;
    }
    
    难道你的总数似乎是计算整个文件中每个条目的总数,而不是每个单独索引的总数。与累加“occurs”列的方式类似,你希望累加“total”列。@ChrisCooper:如何累加“total”列?你能帮我编一个伪代码吗?我正在写一个答案。你应该可能还需要注意的是,循环累积不会自动忽略注释行。您可以通过未使用的
    std::getline()忽略第一行
    或一次对一行进行特殊处理,忽略任何以
    “#”开头的字符。
    无论哪种方式,都需要对其进行寻址。总计似乎是计算整个文件中每个条目的总计,而不是每个单独索引的总计。与累加“occurs”列的方式类似,您希望累加“occurs”“总计”列。@ChrisCooper:如何累计总计列?您能帮我一个伪代码吗?我现在正在写一个答案。您可能还应该注意,除此之外,循环累计不会自动忽略注释行。您可以通过未使用的
    std: