如何在MAP c ++中添加2个以上的模板?

时间:2015-05-24 05:24:17

标签: c++ dictionary

目前我正在尝试实现地图数据结构来解决我的问题,但我只能在一个地图上添加两个模板。例如

map<string, int> data;

如果我想添加两个以上,它将无法工作,我将得到各种内存和映射语义错误,如

Memory

1) type allocator_type aka int cannot be used  prior to '::'


Map

1)  rebind_alloc following 'template' keyword does not refer to a 
template

2) Multiple overloads of 'map' instantiate to the same signature 'void(const)

这是代码

    void Teacher::modifyScore(string newName, int newEnglish, int newMath, int newBio) {

    // Holds file data
    map<string, int, int, int> data;

    // Read file and fill data map
    ifstream studentRec("StudentRecord.txt");
    string line;

    while (getline(studentRec, line))
    {
        string name;
        int english;
        int math;
        int bio;
        stringstream ss(line);
        ss >> name >> english >> math >> bio;
        data[name] = english;
        data[name] = math;
        data[name] = bio;
    }

    studentRec.close();

    // Print data
    for (auto& entry : data)
    {
        cout << entry.first << " " << entry.second << endl;
    }
    // Modify data
    if(data[newEnglish] != 0) {
        data[newName] = newEnglish;
    }

    if(data[newMath] != 0) {
        data[newName] = newMath;
    }

    if(data[newBio] != 0) {
        data[newName] = newBio;
    }

//    if(data[newChemical] != 0) {
//        data[newName] = newChemical;
//    }

    // Open same file for output, overwrite existing data
    ofstream ofs("StudentRecord.txt");
    for (auto& entry : data)
    {
        ofs << entry.first << setw(10) << entry.second << setw(10) << entry.third << setw(10) << entry.fourth << endl;
    }
    ofs.close();

}

只能使用2个模板。

编辑:我如何汇总每个数据?

for (const auto& entry : data)
    {
        tie(newEnglish, newBio, newMath) = entry.second;


        of << entry.first << setw(10) << ?? << setw(10) << ?? << setw(10) <<  ?? << endl;

    }

1 个答案:

答案 0 :(得分:1)

您需要使用的是元组http://de.cppreference.com/w/cpp/utility/tuple

std :: map只能存储2个参数:keytype和datatype,从概念上讲,你需要一个存储多种数据类型的数据类型。

您的地图会变成

std::map<std::string, std::tuple<int, int, int>> data;

有关元组的使用,请参阅链接文档

编辑: 要添加新值,您可以使用

int a, b, c;
...
data["Batman"] = std::make_tuple(a, b, c);

EDIT2: 在while循环中,代码

    data[name] = english;
    data[name] = math;
    data[name] = bio;

会变成

    data[name] = std::make_tuple(english, math, bio);

EDIT3 要访问元组数据,您需要使用std :: tie

int english, bio, math; 
std::tie(english, bio, math) = data["batman"];

EDIT4 用于访问for循环迭代地图内的元组数据的最小样本

#include <map>
#include <tuple>

int main()
{
    std::map<int, std::tuple<int, int, int>> data;

    for (const auto& entry : data)
    {
        int a, b, c;
        std::tie(a, b, c) = entry.second;
    }

    return 0;
}

EDIT5 std :: tie函数将元组数据提取到提供的变量中。

您的代码

tie(newEnglish, newBio, newMath) = entry.second;
of << entry.first << setw(10) << ?? << setw(10) << ?? << setw(10) <<  ?? << endl;

会变成

tie(newEnglish, newBio, newMath) = entry.second;
of << entry.first << setw(10) << newEnglish << setw(10) << newBio << setw(10) <<  newMath << endl;