存储到函数内的映射

storing to a map inside a function

本文关键字:映射 函数 存储      更新时间:2023-10-16

我正在尝试编写一个函数,该函数将从文本文件将信息输入到地图中。我的主要代码如下:

int main(){
    typedef map<int,student*> record;
    record allstudents;
    fileinput("inputtest.txt",allstudents);

    //rest of code....
}

其中函数"fileinput"定义为:

void fileinput(string datafile, record map){ 
    fstream file1(datafile);
    if(!file1.good()){
    //error code
    }
    //Pulls information from file
    student* S1= new physics(name,ID); //creates a new pointer
    //(*S1).printinfo(); //Can print info if required for de-bug
    map[ID]=S1; //store to map
    entries++;  //counts entries read in            
    }
    cout<<"Import complete. "<<entries<<" new students entered."<<endl;
}

当我从测试文件中运行这段代码时,如果我取消注释(*S1).printinfo();,它将读取数据并输出正常,并且将正确计算已读入的学生人数。但是,当我回到我的主函数并输出现在存储在allstudents中的内容时,那里似乎什么都没有?

为什么会发生这种情况,有人知道解决这个问题的方法吗?我已经删减了很多代码,试图让它更易于阅读,但如果您需要查看其余部分,我可以随时对其进行编辑。

谢谢。

这是因为您按值传入map。将函数的签名更改为

void fileinput(string datafile, record &map)

简短解释:当您按值传递时,会创建参数(map)的副本。在函数内部,您可以对该副本执行修改,但当函数返回并且副本超出范围时,这些修改将丢失。它们不会自动传播回"源"对象。

有关详细说明,请参阅按引用/值传递C++。

您是按值传递映射的,因此该函数会制作自己的副本,并且您的原始副本保持不变。尝试通过引用传递:

void fileinput(string datafile, record& map) { ... }
                                      ^ reference!