小心使用STL中map的[]操作符

一个map就是一个(关键码(key),值(value))对偶的序列,它提供基于关键码的快速提取操作。也就是说,可以用下标运算符[]将关键码作为下标去执行查找,并返回对应的值。因此可以把map的使用方法想象成有特殊下标的数组。在很多时候用下标运算符[]来对map中的元素进行存取是非常方便和简单的;但是,如果map下标运算符[]运用不得当,也会造成意想不到的问题。
我们知道,C++是不检查下标越界的。用超出数组下标范围的下标去访问数组元素的错误会在运行期出现,很有可能将程序搞崩溃。对于map而言,也没有类似的下标越界概念,但是却有作为下标的关键码(key)在map中不存在的现象。在这种情况下,如果运用不得当,就造成意想不到的问题,而且这种问题是属于比较隐蔽的问题。如果对map的下标运算符[]不是非常了解,将很难发现问题所在。
比如说有下面的代码片断:

// 定义一个map
map<string, string> mapTelDir;

// 用[]操作符可以方便快速的给map添加内容
mapTelDir["StarLee"] = "13813131313";

// ...

// 修改关键码为LiXing的值
// 注意,这里的关键码在map里面并不存在
if (mapTelDir["LiXing"] == "13913131313")
{
mapTelDir["LiXing"] = "13513131313";
}

// ...

// 输出
cout << "The cellhone number of LiXing is: " << mapTelDir["LiXing"] << endl;
上面的代码看起来似乎没有任何问题,但是,最后一行的输出的手机号码却永远为空!原因就是在判断语句里面对map的下标运算符[]的错误使用。
map的下标运算符[]的作用是:将关键码作为下标去执行查找,并返回对应的值;如果不存在这个关键码,就将一个具有该关键码和值类型的默认值的项插入这个map。
对于上面的代码来说,if (mapTelDir["LiXing"] == "13913131313")这行代码首先去查询map中是否有关键码为LiXing的项,结果发现没有该项,于是就向map中插入了一项<"LiXing", "">(sting的默认值为空字符串)。这就造成if语句的判断结果永远为false,那样就不可能修改修改关键码为LiXing的值。
为了更好的说明这个问题,可以看一下map下标运算符[]的实现代码:

// 下面的代码摘自VS2005中的..vcincludemap
mapped_type& operator[](const key_type& _Keyval)
{    // find element matching _Keyval or insert with default mapped
iterator _Where = this->lower_bound(_Keyval);
if (_Where == this->end()
|| this->comp(_Keyval, this->_Key(_Where._Mynode())))
_Where = this->insert(_Where,
value_type(_Keyval, mapped_type()));
return ((*_Where).second);
}
map的下标操作符[]使用上面的方法定义,使向map里插入值和使用关键码来访问相应的值变得非常方便而快速。虽然在使用的时候会出现有人写出类似上面那样的错误代码,但是这是程序员的错误,因为写出正确的代码是程序员的责任。这样做很符合C++的风格:非常灵活,但是要小心使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

存图

转载于:https://www.cnblogs.com/simple-huang/p/10183360.html

地平线机器人_地平线机器人CEO余凯:基于深度学习的自动驾驶之路

请关注公众号“汽车创新港”&#xff0c;获取后续更多论坛实录&#xff01;加工作人员微信号&#xff1a;tinydanio&#xff0c;备注“我要入群”直接进入直播群&#xff01;今天都是大牛&#xff0c;下面的也是技术大牛&#xff0c;是百度深度学习实验室创始人&#xff0c;百度…

Mac os下android studio模拟器无法联网解决方法

步骤1: https://blog.csdn.net/qq_33945246/article/details/79908298 步骤2: 访达进入/Users/文件夹 步骤3: shiftcmmand.显示隐藏文件夹 步骤4 打开.android文件夹 点击adv文件夹进入&#xff0c;然后回到 "步骤1"查看解决方法 本人创业做的一款androidApp, 下载量…

matlab中表示拉普拉斯分布_深度优化局部拉普拉斯金字塔滤波器。

微信公众号&#xff1a;OpenCV学堂关注获取更多计算机视觉与深度学习知识觉得文章有用&#xff0c;请戳底部【好看】支持算法概述基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究员Sylvain Paris(大神级人物&#xff0c;写了很多文章)提出的&#xff0c…

设计模式 命令模式 实例_根据您的命令-命令设计模式

设计模式 命令模式 实例命令设计模式是一种广为人知的设计模式&#xff0c;属于行为设计模式&#xff08;“四人帮”的一部分&#xff09;。 顾名思义&#xff0c;它与应用程序中的动作和事件有关。 问题陈述&#xff1a; 假设有一个网页将在其中包含多个菜单的情况。 编写此…

Linux(CentOS)挂载U盘、移动硬盘以及文件拷贝、备份

说明&#xff1a; 环境&#xff1a;VMware workstation 系统&#xff1a;centos6.2 以下操作均在root下执行的 1.U盘挂载 mkdir /mnt/usb //创建一个目录&#xff0c;用于挂载U盘 fdisk -l //查看系统中挂载的U盘&#xff0c;若系统有一块硬盘sdb1 代表你的U盘&#xff0c;…

iservice封装有哪些方法_5w大功率led白光灯珠参数,5w大功率led灯珠有哪些?

5w大功率led&#xff0c;5w大功率led白光灯珠参数&#xff0c;5w大功率led灯珠有哪些&#xff1f;5w大功率led&#xff0c;5w大功率led白光灯珠参数&#xff0c;5w大功率led灯珠有哪些&#xff1f;5w大功率led灯珠今天上午&#xff0c;一位台湾高雄的客户咨询定做5W大功率LED灯…

Java EE调度程序

Java EE应用程序服务器具有本机调度支持&#xff0c;并且在大多数应用程序中&#xff0c;不需要包括外部依赖项&#xff0c;例如著名的Quartz调度程序库。 Java EE 6和7完整配置文件中提供的Java EE 6计时器服务为我们提供了许多选项来定义调度间隔&#xff0c;以及如果停止并…

Simulink工作区无法保存To workspace模块的数据解决办法

1.首先要搞清楚Workspace概念。包括基本工作区&#xff08;base workspace&#xff09;和函数工作区。默认条件下在命令窗口中输入命令使用的是base workspace&#xff0c;但对于每个函数&#xff0c;都有自己独立的工作区。 2.GUI回调函数作为function有独立的工作区。 3.使…

对KVM虚拟机进行cpu pinning配置的方法

这篇文章主要介绍了对KVM虚拟机进行cpu pinning配置的方法,通过文中的各种virsh命令可进行操作,需要的朋友可以参考下首先需求了解基本的信息1 宿主机CPU特性查看 使用virsh nodeinfo可以看到一些基本信息 #virsh nodeinfo CPU model: x86_64 CPU(s): 32 CPU frequency: 1200 M…

1千条数据平均分配给15人_5项数据挂零!但5犯太吓人!CBA第1狠人场均干1人

昨天CBA常规赛第26轮&#xff1a;山东西王89-86北京首钢。上半场&#xff0c;双方打得非常激烈&#xff0c;比分交替领先。第3节北京抓住机会&#xff0c;顺势拉开比分(68-57)。李慕豪接方硕助攻&#xff0c;轻松扣篮得分。首钢替补席一片欢声笑语&#xff0c;方巨头和翟晓川笑…

redhat/centos 搭建svn服务器环境

subversion支持3种服务配置1、apache mod_dav_svn2、svnserve 3、穿越ssh隧道的svnserve教程选择的是最简单的svnserve的服务1、安装svnservyum install subversion2、建立一个仓库 respository$ mkdir /home/svn$ mkdir /home/code$ svnadmin create /home/svn/repository3、…

win10插入耳机没声音解决办法

之前重装了win10系统&#xff0c;装完系统后&#xff0c;发现插入耳机没有声音&#xff0c;非常令人难受&#xff01;经过一番探索&#xff0c;终于解决了这个问题&#xff0c;在此与大家分享。 1.点击左下角搜索框&#xff0c;输入控制面板&#xff0c;点击enter打开 2.打开…

js如何获取服务器端时间?

用js做时间校正&#xff0c;获取本机时间&#xff0c;是存在bug的。 使用js也可获取到服务器时间&#xff0c;原理是使用 ajax请求&#xff0c;返回的头部信息就含有服务器端的时间信息&#xff0c;获取到就可以了。以下&#xff1a; 1、依赖jQuery 代码&#xff1a; function …

java 堆转储快照_Java堆转储:您可以完成任务吗?

java 堆转储快照如果您像我一样对Java性能充满热情&#xff0c;那么堆转储分析对您来说应该不是一个谜。 如果是这样&#xff0c;那么好消息是您将有机会增加您的Java故障排除技能和JVM知识。 JVM现在已经发展到这样的程度&#xff1a;与旧的JDK 1.0 – JDK 1.4天相比&#xf…

电池供电的电容麦_太阳能航空障碍灯供电机制设计

南京徐航航空设备有限公司是以产销GPS航空障碍灯,led航空障碍灯,LED智能航空障碍灯,交流航空障碍灯,航空障碍灯品牌,智能型航空障碍灯,GPS航空障碍灯,led航空障碍灯,LED智能航空障碍灯,交流航空障碍灯,航空障碍灯品牌,智能型航空障碍灯等方面产品获得民航认证航空障碍灯品牌,是…

simulink如何从goto模块快速找到相应的from模块

有时候&#xff0c;Simulink搭建的模型中模块过多&#xff0c;很难找到goto模块所对应的from模块。下面将举例说明如何从goto模块快速找到相应的from模块。 方法1 双击goto模块会弹出下图图框&#xff0c;点击图框的链接即可找到对应的from模块。如下图所示。 对应的from模块…

aac fhg lc哪一个模式_旅游没电别发愁,一个充电头,助你游遍全球

我朋友汪伦。最近在计划出国旅游&#xff0c;我问他都准备了啥&#xff0c;他说根据网上的攻略&#xff0c;带了现金泡面老干妈还有一万个充电宝。现金我懂&#xff0c;国外还没普及扫码支付&#xff1b;泡面是怕外国菜吃不惯&#xff1b;老干妈是夹汉堡吃的&#xff1b;一万个…

11 字节码执行

转载于:https://www.cnblogs.com/likevin/p/10183151.html

在Junit上使用Kafka

除了在原始Kafka Producer和Consumer上更易于使用的抽象之外&#xff0c;优秀的Spring Kafka项目提供的简洁功能之一是在测试中使用Kafka的方法。 它通过提供可轻松设置和拆卸的Kafka嵌入式版本来实现此目的。 一个项目需要包括此支持的全部就是“ spring-kafka-test”模块&am…