C++中如何使用单行insert方法插入嵌套map?
C++中如何使用单行insert方法插入嵌套map?
嗨,我来帮你拆解这个问题~
首先,咱们先明确你代码里的核心问题:你对std::map::insert的参数要求理解错啦!你的外层map类型是map<string, map<string, int>>,这意味着它的每个元素都是**pair<string, map<string, int>>**——也就是键是string,值是完整的内层map,而不是单个的pair<string, int>。你之前写的insert("TEST", make_pair<string,int>("ONE",2))里,第二个参数是个pair,和外层map要求的map<string,int>类型完全不匹配,这就是编译失败的原因。
那怎么改成单行的正确写法呢?给你几种实用的方案:
方案1:用列表初始化构造内层map,传给insert
C++11及以后支持列表初始化,你可以直接在内层构造好一个包含键值对的map,作为外层insert的第二个参数:
my_map.insert(std::make_pair("TEST", std::map<std::string, int>{{"ONE", 2}}));
或者用更直观的std::pair构造:
my_map.insert(std::pair<std::string, std::map<std::string, int>>("TEST", {{"ONE", 2}}));
方案2:用emplace代替insert(更高效)
emplace可以直接在map内部构造键值对对象,避免额外的拷贝,写法同样简洁:
my_map.emplace("TEST", std::map<std::string, int>{{"ONE", 2}});
甚至可以进一步简化(C++17及以上支持类模板实参推导):
my_map.emplace("TEST", std::map{{"ONE", 2}});
补充:关于你想用的my_map["TEST"]["A"]访问方式
这个写法完全没问题!operator[]的特性就是:如果外层map里没有"TEST"这个键,会自动创建一个空的内层map<string,int>;然后内层的operator[]如果没有"A"这个键,也会自动初始化对应的int值为0,所以你可以放心这么用。
总结一下:你不需要把内层map改成pair,只要给外层insert传一个完整的内层map对象(哪怕这个内层map只有一个键值对)就行啦~
备注:内容来源于stack exchange,提问作者Rıfat Tolga Kiran




