C++ 如何在地图c+;中添加两个以上的模板+;?

C++ 如何在地图c+;中添加两个以上的模板+;?,c++,dictionary,C++,Dictionary,目前我正试图实现一个地图数据结构来解决我的问题,但我只能向一个地图添加两个模板。比如说 map<string, int> data; 这是密码 void Teacher::modifyScore(string newName, int newEnglish, int newMath, int newBio) { // Holds file data map<string, int, int, int> data; // Read fi

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

map<string, int> data;
这是密码

    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();

}
void Teacher::modifyScore(字符串newName、int newEnglish、int newMath、int newBio){
//保存文件数据
地图数据;
//读取文件并填充数据映射
ifstream studentRec(“StudentRecord.txt”);
弦线;
while(getline(studentRec,line))
{
字符串名;
国际英语;
整数数学;
int bio;
弦流ss(线);
ss>>姓名>>英语>>数学>>生物;
数据[名称]=英文;
数据[名称]=数学;
数据[名称]=生物;
}
studentRec.close();
//打印数据
用于(自动输入:数据(&T)
{

cout您需要使用的是一个元组

映射只能存储两个参数:keytype和datatype,从概念上讲,您需要一个存储多个数据类型的数据类型

你的地图会变成

std::map<std::string, std::tuple<int, int, int>> data;
编辑2: 在while循环中,代码

    data[name] = english;
    data[name] = math;
    data[name] = bio;
将成为

    data[name] = std::make_tuple(english, math, bio);
tie(newEnglish, newBio, newMath) = entry.second;
of << entry.first << setw(10) << newEnglish << setw(10) << newBio << setw(10) <<  newMath << endl;
编辑3 要访问元组数据,需要使用std::tie

int english, bio, math; 
std::tie(english, bio, math) = data["batman"];
编辑4 在映射上迭代的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;
}
#包括
#包括
int main()
{
地图数据;
用于(常数自动输入:数据)
{
INTA、b、c;
std::tie(a,b,c)=entry.second;
}
返回0;
}
编辑5 tie函数将元组数据提取到提供的变量中

你的代码

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

关于如何输入数据,例如entry.first、entry.second[0]?在while循环中,我应该输入什么?data[name]=?如何扩展它?&entry.second[?]。我尝试使用&get(entry)但它仍然显示内存分配,而不是实际值。应该不需要特殊语法,只需在示例代码周围放置一个for循环。我将添加一些代码以澄清请学习正确的术语。“将模板添加到映射”这完全是胡说八道。您要做的是使用类型参数实例化map类模板,其中值类型是复合类型。
#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;
}
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;