1

テキスト ファイルに 1000 個の統計データのセットがあるとします。その最初の列はインデックスの数を表し、2 番目の列はその値を表します。インデックスは繰り返すことができ、対応する値は異なる場合があります。インデックスの出現回数とそれぞれの値の合計をカウントしたいと思います。

インデックスの出現の結果を与えるコードを書きますが、対応する値の合計を与えることができません。

私のテキストファイルに次のようなデータセットがあるとします-

#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は2 回発生し、値の合計= (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  occurs  total
3       1     2.851
4       4     2.851
5       3     2.851
6       2     2.851
7       1     2.851

発生数は正しいのですが、

合計 += 値;

探している出力が生成されません。各インデックスの合計を取得するにはどうすればよいですか?

4

3 に答える 3

7
  1. totalインデックスごとに必要です。
  2. countインデックスごとに必要です。

これに対する簡単な解決策は、次の構造を使用することです。

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;

numberあなたが読んだことは である必要がある(またはする必要がある)とは思わないことに注意してください。平等を比較するのが難しいためdouble、人生をより複雑にします。コード内の宣言を変更する必要がありますdoublenumberint

于 2013-08-06T15:48:43.043 に答える
2

合計は現在、各インデックスの合計ではなく、ファイル全体の合計のみをカウントします。'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;
}

インデックスを独自のマップに格納するのと同じ方法で、各列を独自の合計マップに格納しています。

于 2013-08-06T15:50:59.457 に答える
0

インデックスごとに追加するのに対し、インデックスごとに個別に追加するvalue必要があります。totaltotal

一致する値のベクトルへのインデックスのマップが最も単純なので、別のステップで各インデックスの合計を計算できます。

読書ループの本体は次のようになります

index[ number ].push_back( value );

次に、関連するベクトルの要素の合計を生成する index のすべてのエントリをループします。(ヒント -accumulateはその一般的な名前です....)

編集:ああ、カウントは明らかに各ベクトルの要素の数です。

于 2013-08-06T15:47:29.537 に答える