STL中map的operator[ ]使用方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LookAtTheStars/article/details/52032129

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

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

map<string, string> mapInfo;
if ("kevin" == mapInfo["name"])
{
    mapInfo["name"] = "man";
}
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下标运算符[]的例子,用于深化对上面结论的记忆:

class Obj
{
public:
	//...
};

map<string, Obj*> mapStr2Obj;
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函数,如下面代码所示:

bool isExist(const string& sKey)
{
    return (mapKV.find(sKey) != mapKV.end());
}
通过find函数判断指定的sKey是否在mapKV中,写起来有点恶心,不过这样可以避免了错误的发生。

没有更多推荐了,返回首页