双重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;
    }
}
posted @ 2025-09-13 17:21  开心猪扒  阅读(15)  评论(0)    收藏  举报