C ++使用文本文件中的数据存储映射对

时间:2013-05-02 07:28:37

标签: c++ file-io map

我有一个文本文件,存储一个棒球运动员ID和玩家rbi(运行击球)总数。 ID都是四位数,rbis的范围是60到110.看起来像这样。

5554 102 87 63 90 5553 66 68 90 102 等...

我编写了一些代码来将ID存储在一个集合中,计算文本文件中四个rbi总计的平均值,并将结果输出到控制台。我的家庭作业指出,我必须将玩家ID和rbi平均值存储到地图对中,而不是一组。我以为我读过映射对的语法是

typedef pair<const Key, T> value_type;

但我在使用映射对重写此代码时遇到问题。有什么想法吗?

 #include <iostream>
 #include <fstream>
 #include <set>

 using namespace std;
 int main() 
 {
    ifstream input("filepath\\*.txt");
    multiset<int> values;

    // Read data from file 
    for(unsigned int j = 1; j <= 4; j++)
    {
    int player;
    (input >> player);

    int rbi;
    double total = 0.0;
    double average = 0.0;
        for(unsigned int i = 1; i <= 4; i++)
        {
        // Compute the average. 
        (input >> rbi);
        values.insert(rbi);
        total += rbi;
        average = total/4;
        }

    //Output totals to console
    cout << player;
    cout << " " << average << endl;
    }

 system("Pause");
 return 0;
 }

2 个答案:

答案 0 :(得分:3)

我认为他们希望您将结果存储在std :: map中。它是C ++(std :: pair)中键值对的容器。您可以使用以下语法将值插入地图:map[key] = value;

例如。

std::map<int, int> baseball_players;
for (...)
{
    // Calculate average
    baseball_players[player] = average;
}

答案 1 :(得分:2)

首先,我想与您分享一些您可能觉得有用的代码说明。

从文件中读取数据时使用冗余括号

int player
(input >> player);

但以下情况很好:

int player;
input >> player; // No need for (...)

此外,您可能想要修复缩进样式。 而不是:

int rbi; 
double total = 0.0; 
double average = 0.0;
    for(unsigned int i = 1; i <= 4; i++)
    {
    // Compute the average. 
    (input >> rbi);
    values.insert(rbi);
    total += rbi;
    average = total/4;
    }

成功:

int rbi;
double total = 0.0;
double average = 0.0;
for (unsigned int i = 1; i <= 4; i++)
{
    // <--------- Indent here, INSIDE loop body

    // Compute the average. 
    input >> rbi;
    values.insert(rbi);
    total += rbi;
    average = total/4;
}

此外,请考虑使用像4这样的常量,而不是像kPlayerCount那样使用“幻数”。这将使您的代码更易于阅读和维护。


关于您的特定问题,如果您想存储一对(玩家ID,平均打点),您可以使用 std::map 。 假设玩家ID存储在int s中,平均值为double s中的RBI,则可以使用:

std::map<int, double> result; 

(更优雅的解决方案可能是使用typedef而非“原始”类型,例如typedef int PlayerID;std::map<PlayerID, ...。)

此外,要计算平均值,请将值存储在std::multiset中。通常,如果要存储一系列值,首选应该是简单的 std::vector ;您可以使用其push_back()方法向其添加数据,并且矢量将自动调整大小以适应新数据。

但在这种情况下,您不需要将读取数据存储在某处(然后使用读取数据丢弃容器):您只需要计算平均值。所以你只需要在 total 中累积读取数据,然后用除法计算平均值。

根据上述说明,可能会重写您的代码:

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

using namespace std;

int main() 
{
    static const int kPlayerCount = 4;
    static const int kRbiCount = 4;

    // Store pairs (PlayerID, RBI average)
    map<int, double> result; 

    // Read data from file 
    ifstream input("data.txt");
    for (int currPlayer = 1; currPlayer <= kPlayerCount; currPlayer++)
    {
        int playerId;
        input >> playerId;

        // Read RBIs and compute average
        int rbi;
        input >> rbi;
        double total = rbi;
        for (int i = 2; i <= kRbiCount; i++)
        {
            input >> rbi;
            total += rbi;
        }
        const double average = total / kRbiCount;

        // Store player ID and RBI average in the map
        result[playerId] = average;
    }


    // Output results to console
    for (auto it = result.begin(); it != result.end(); ++it)
    {
        cout << "Player: "      << it->first  << endl;
        cout << "Average RBI: " << it->second << endl;
        cout << "--------" << endl;        
    }
}

使用包含此数据的输入文件:

5554 102 87 63 90 5553 66 68 90 102 5560 67 77 99 100 5540 88 77 100 102

输出是:

Player: 5540
Average RBI: 91.75
--------
Player: 5553
Average RBI: 81.5
--------
Player: 5554
Average RBI: 85.5
--------
Player: 5560
Average RBI: 85.75
--------