You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:53:01