双重map 的赋值初始化
示例分析
#include <iostream>
#include <map>
using namespace std;
typedef std::map<uint32_t, int> ST_ATTR; // 内层map:key=uint32_t,value=int
typedef std::map<uint16_t, ST_ATTR> ST_CTRL; // 外层map:key=uint16_t,value=内层map
int main() {
ST_CTRL ctrlMap; // 实例化外层map
// 嵌套赋值
ctrlMap[1][1] = 1;
// 验证结果
cout << "外层map键1对应的内层map中,键1的值为:"
<< ctrlMap[1][1] << endl; // 输出:1
return 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=int
typedef 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;
}
}

浙公网安备 33010602011771号