用insert运算符填充嵌套的std::map

用insert运算符填充嵌套的std::map,map,insert,nested,Map,Insert,Nested,我有以下代码: #include <iostream> #include <utility> #include <map> using namespace std; int main() { map<int, map<string, int> > mapa; // way A mapa[10]["aaa"] = 20; // way B -> Compilation Error pair<int, pair<s

我有以下代码:

#include <iostream>
#include <utility>
#include <map>

using namespace std;

int main()
{
map<int, map<string, int> > mapa;

// way A
mapa[10]["aaa"] = 20;

// way B -> Compilation Error
pair<int, pair<string, int> > par(10, make_pair("aaa", 20));
mapa.insert(par);


return 0;
}
我知道填充地图的方法是有效的。 我想使用方式B,但它会引发编译错误: 错误:调用“std::map,int>::mapconst std::pair,int>&”时没有匹配函数

如何使用insert运算符填充嵌套贴图


Pd:我不使用[]运算符,因为它需要定义默认构造函数,因为我使用的是Boost中的time\u period对象,所以我没有该构造函数。

您的映射类型是map of int->map of string->int,但您正在尝试插入map of int->pair string,int类型的条目。一对不是映射,因此出现错误

编辑:

根据,对map的[]操作符的调用相当于一系列其他操作:

映射的类型和运算符[]常量键类型和k

对该函数的调用相当于: *此->插入make\u pairk,映射\u type.first.second

在你的例子中,调用mapa[10][aaa]=20;相当于:

(*(( (*((mapa.insert(make_pair(10,map<string, int>()))).first)).second
  .insert(make_pair("aaa",20))).first)).second

但我相信,如果存在键10或aaa,则不会在地图中插入任何元素。我建议您仔细阅读文档并测试预期行为。

是的,您是对的。我理解什么是编译错误。我想知道的是,我如何做一些类似于A的事情,但是使用insert操作符而不是[]操作符。它实际上有点复杂,因为键可能存在。如果存在,则该值(即映射)存在,您必须对其进行更新。如果没有,则必须创建地图。