You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动