C++ 具有相似索引的值之和
假设我在一个文本文件中有一组1000个统计数据。其中第一列表示索引的数量,第二列表示索引的值。索引可以重复,相应的值可以不同。我想计算索引的出现次数以及每个索引的值之和 我编写了一个代码,它给出了索引出现的结果,但没有给出相应的值之和 示例 假设我的文本文件有这样一组数据-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
#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: