填充含std::vector的嵌套std::map时现有逻辑是否属于过度复杂?
核心误区纠正
你混淆了std::map和std::vector的[]运算符行为:只有std::map的[]访问不存在的键时,才会自动插入默认构造的对应值;std::vector的[]仅支持访问已存在的下标,越界访问属于未定义行为,不会自动新增元素,你查阅的std::vector::operator[]官方说明是完全正确的。
你的代码确实属于过度复杂,可以大幅简化
你当前的逻辑完全可以合并为一行代码:
m_mapScheduleFutureHist[eHistAssign][strName].push_back(datAssign);
逻辑解释:
- 内层容器
WeekendFutureItemHistMap本质是std::map<CString, std::vector<COleDateTime>>,调用[strName]时如果键不存在,会自动插入一个默认构造的空std::vector<COleDateTime>,并返回该vector的引用 - 随后调用
push_back(datAssign)就可以直接把时间值添加到vector中,和你原有的if-else分支效果完全一致,还省去了一次find查找的开销,代码可读性更高
额外说明
你原有代码中已经直接使用了外层map的[eHistAssign],说明你已经在利用std::map的[]自动插入特性,内层逻辑完全可以沿用同样的规则,不需要额外做存在性判断。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

