STL map容器[]运算符陷阱

来源:互联网 发布:在html中引入js文件 编辑:程序博客网 时间:2024/06/16 19:14


       之前在排查一个界面数据显示出错问题,一开始以为是内存越界导致map里面存的数据出现了异常,经过调试后发现map容器的[]运算符使用中存在陷阱,一不小心容易出错导致内部数据产生变化。

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

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


       上面的代码是我原来代码中的精简版,大致就是为了在map中遍历查找到指定的元素后做一些操作,但是现在遇到了问题。

       不用说猜都肯定猜到,map虽然在最初只添加了一个元素,但经过for循环之后已经不再是1了,而是101。也就是从0-100全部都填充了元素。

       其实这就是[]运算符设计的时候不单单是一个取值的过程,还包含了一个在没有元素的情况下插入元素的过程,其代码相当于:


        这样的话for循环在一开始遍历的时候不停的往里插入元素,从而导致size也在不停的变大,最后一直到100的时候遇到了原来初始化过的元素才停下来。这也就是我当初查的问题中数据多出来的原因。

        既然现在知道了[]运算符有上述的陷阱,我们应该避免使用[]来对map进行操作,而是参考以下规则:

        1.      向map容器插入元素时直接使用insert函数

        2.      遍历map容器时使用iterator迭代器

        3.      修改或者删除元素时使用find函数找到元素后再进行操作

        []运算符对程序员来说是非常熟悉的,数组操作中非常常用,有时就是这样导致了我们对它产生一种想当然的想法,认为就是一个取值的操作,大部分情况下就算被重载其功能也是如此,但是就是一些特例情况会出现上述的问题。

1 0
原创粉丝点击