map的[]操作符包含隐性操作:当key不存在的时候,会默认执行insert操作
这种隐性操作在大多数情况下是有害的。
比如下面的代码:
// 判断是否有效技能ID
inline BOOL KSkillManager::IsValidSkillID(int nSkillID)
{
BOOL bRet = m_mapSkillID2SettingIndex[nSkillID] > 0;//当nSkillID不存在时,会执insert(nSkillID, 0)
return (bRet);
}
判断一个nSkillID是否有效,却偷偷的对无效的技能id做了插入操作,导致有大量非技能ID用作查询的时候,map变得非常大,严重影响系统效率。
这种情况的正确用法如下:
// 判断是否有效技能ID
inline BOOL KSkillManager::IsValidSkillID(int nSkillID) const
{
std::map<int, int>::const_iterator it = m_mapSkillID2SettingIndex.find(nSkillID);
BOOL bRet = (it != m_mapSkillID2SettingIndex.end() && it->second > 0);
return (bRet);
}
修改要点: