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
- STL map容器[]运算符陷阱
- STL容器map的下标运算符[]
- STL容器map的下标运算符[]
- STL容器map的下标运算符[]
- STL容器 list、vector、map、set 使用的陷阱
- STL中map使用陷阱
- STL容器--关联容器map
- STL::map关联容器
- STL容器之map
- STL之Map容器
- STL容器:map,multimap
- STL之map容器
- STL中的map容器
- STL之容器map
- STL set map容器
- STL容器之map
- C++ STL--map容器
- STL-map容器
- java日志处理组件log4j--log4j.xml配置详解
- 汇编寄存器的使用,SI,DI的使用
- [12] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用高级功能
- 当你输入一个网址的时候,实际会发生什么
- $("#form input")和$("#form :input")区别
- STL map容器[]运算符陷阱
- Android Fragment完全解析,关于碎片你所需知道的一切
- AOP的使用
- Intellij idea : could not create the java virtual machine
- 忽略SAP Solution Manager Key
- 音乐类软件LoveMusic开发(一)----产品简介
- 在没有微信在没有微信 转载
- Java--基础--字符串中提取数字
- 二十三种设计模式之一单例模式