STL中map的operator[ ]使用方法

2 篇文章 0 订阅

 在STL中,map是一个关联式容器,它提供一对一的数据处理能力,即其中每一个元素都是一个键值对,通过一个唯一的关键字,可以唯一映射到对应的数据值。而map中重载了下标运算符[],通过下标操作,开发人员可以很方便地根据关键字获取到对应的值。虽然使用方便,但是还是有一些地方容易出现问题,值得大家的注意。

       下面代码的输出结果会什么呢?

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. map<string, string> mapInfo;  
  2. if ("kevin" == mapInfo["name"])  
  3. {  
  4.     mapInfo["name"] = "man";  
  5. }  
  6. cout<<mapInfo["name"]<<endl;  

 

       上面代码的目的是,判断mapInfo["name"]的值是否为"kevin",如果是则修改mapInfo["name"]的值为"man",最后输出mapInof["name"]的值。代码看似没有问题,但是输出却永远为空,原因就是在判断语句里面对map的下标运算符[]的错误使用。
       map的下标运算符[]的作用是:若key存在,则返回相应的value;若key不存在,则对该key对应的value赋一个对应value类型数据的默认值并返回。
       在上面的代码中,对于if ("kevin" == mapInfo["name"])这行代码,首先会判断mapInfo中关键字为name的项是否存在,此时程序发现没有该项,因此会在mapInfo中插入一项("name", ""),此时mapInfo["name"]的值就为空字符串,这就导致了if判断的结果永远都为false,进不了if代码块里面修改数据。map下标运算符[]使用固然方便,但是使用不当却可能出现严重的问题,因此需要注意一下。

       下面也是一个关于map下标运算符[]的例子,用于深化对上面结论的记忆:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class Obj  
  2. {  
  3. public:  
  4.     //...  
  5. };  
  6.   
  7. map<string, Obj*> mapStr2Obj;  
  8. Obj *ptr = mapStr2Obj["abc"];   //ptr等于NULL  

 

       上面代码中,map的key是string类型,而value则是Obj*类型,即Obj类型的指针,而mapStr2Obj中并不在关键字为"abc"的项,对于mapStr2Obj["abc"],程序会自动插入一项("abc", NULL),此时关键字为"abc"的项对应的值是一个空指针,若不小心使用到这个之后指针访问数据时,就会出现Segmentation fault了。不同编译器对于指针赋的默认值是不一样的,当map的value类型是指针的时候,就要注意野指针或空指针问题了。

       从上面的例子可以知道,当需要判断map中是否存在指定的key值时,就不能直接使用map的下标运算符了,这时候可以使用find函数,如下面代码所示:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. bool isExist(const string& sKey)  
  2. {  
  3.     return (mapKV.find(sKey) != mapKV.end());  
  4. }  
通过find函数判断指定的sKey是否在mapKV中,写起来有点恶心,不过这样可以避免了错误的发生。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值