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

3 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值