不要使用有副作用的std.map.[]操作符

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);
}

修改要点:

1.只用作查询的成员函数,申明为const成员,这样可以让编译器帮我们确认是否修改到成员。

2.使用map.find查询key是否存在,而不要使用带有副作用的[]操作符。

posted @ 2017-05-05 15:03  AllyDale  阅读(9)  评论(0)    收藏  举报