示例分析
#include <iostream>
#include <map>
using namespace std;typedef std::map<uint32_t, int> ST_ATTR; // 内层map:key=uint32_t,value=inttypedef std::map<uint16_t, ST_ATTR> ST_CTRL; // 外层map:key=uint16_t,value=内层mapint main() {ST_CTRL ctrlMap; // 实例化外层map// 嵌套赋值ctrlMap[1][1] = 1;// 验证结果cout << "外层map键1对应的内层map中,键1的值为:" << ctrlMap[1][1] << endl; // 输出:1return 0;
}
过程分析
ctrlMap[1][1] = 1; 的执行过程为:
- 外层 map 操作:ctrlMap[1] 检查外层 map 中是否存在键 1(uint16_t 类型)。
- 若不存在,自动插入键 1,并关联一个默认构造的内层 map
- 返回内层 map 的引用(ST_CTRL_MAP_DBLINKID_ATTR&)。
内层 map 操作:[1] = 1
- 对第一步返回的内层 map 执行 [1]:检查内层 map 中是否存在键 1(uint32_t 类型)。
- 若不存在,自动插入键 1,并关联一个默认值(int 类型默认值为 0)。
- 最后将该值赋值为 1。
注意事项
-
这种方式会自动插入不存在的键:如果外层键 1 或内层键 1 原本不存在,operator[] 会自动创建它们,这在大多数场景下是方便的,但需注意是否符合业务逻辑(比如是否允许自动创建新键)。
-
若需避免自动插入(仅修改已存在的键),需先通过 find 检查键是否存在,再操作:
typedef std::map<uint32_t, int> ST_ATTR; // 内层map:key=uint32_t,value=inttypedef std::map<uint16_t, ST_ATTR> ST_CTRL; // 外层map:key=uint16_t,value=内层map// 安全写法:仅修改已存在的键
ST_CTRL::iterator outer_it = ctrlMap.find(1);
if (outer_it != ctrlMap.end())
{ // 外层键1存在auto& inner_map = outer_it->second;auto inner_it = inner_map.find(1);if (inner_it != inner_map.end()) { // 内层键1存在inner_it->second = 1;}
}