不要使用有副作用的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是否存在,而不要使用帶有副作用的[]操作符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章