遍历多个TXT文件后std::map为空的C++问题求助
解决C++ map插入数据后为空的问题(非类内循环场景)
你的问题核心原因是函数参数采用了值传递而非引用传递,导致你在fillCorpus里对map的所有修改都只作用于函数内部的副本,外部声明的原map完全没被更新。
问题分析
C++中,函数参数默认是值传递:当你把外部的Languagekey_Translation和IDkey_LanguageTranslation传入fillCorpus时,系统会创建一份它们的副本。你在函数里修改的都是这份副本,函数执行完毕后副本被销毁,外部的原map自然还是初始状态。
解决方案
把fillCorpus的map参数改成引用传递(在类型前加&),这样函数会直接操作外部的原变量;同时为了避免不必要的复制,把language和language_content改成const引用:
修正后的fillCorpus函数代码:
// 注意参数前的&,以及const引用的使用 void fillCorpus (const string& language, const vector<vector<string>>& language_content, map<string, string>& Languagekey_Translation, map<string, map<string, string>>& IDkey_LanguageTranslation) { map<string, map<string, string>>::iterator itr1; for (int i = 0; i < language_content.size(); i++) { string keyID = language_content[i][0]; string translation = language_content[i][1]; Languagekey_Translation.clear(); Languagekey_Translation.insert(make_pair(language, translation)); itr1 = IDkey_LanguageTranslation.find(keyID); if (itr1 != IDkey_LanguageTranslation.end()) { // 直接更新已存在的key对应的语言翻译 itr1->second.insert(make_pair(language, translation)); } else { // 插入新的keyID和对应的语言翻译map IDkey_LanguageTranslation[keyID] = Languagekey_Translation; } } }
额外优化建议
你可以去掉Languagekey_Translation这个临时map,直接构造临时对象插入,减少代码冗余:
void fillCorpus (const string& language, const vector<vector<string>>& language_content, map<string, map<string, string>>& IDkey_LanguageTranslation) { map<string, map<string, string>>::iterator itr1; for (int i = 0; i < language_content.size(); i++) { string keyID = language_content[i][0]; string translation = language_content[i][1]; itr1 = IDkey_LanguageTranslation.find(keyID); if (itr1 != IDkey_LanguageTranslation.end()) { itr1->second.insert(make_pair(language, translation)); } else { // 直接构造临时map插入,无需额外变量 IDkey_LanguageTranslation[keyID] = {{language, translation}}; } } }
此时主函数里的Languagekey_Translation变量也可以删除,进一步简化代码。
内容的提问来源于stack exchange,提问作者arantxa
相关产品推荐
相关产品推荐

