C:如何阻止map的operator []插入虚假值?

C:如何阻止map的operator []插入虚假值?,第1张

概述我的代码执行了以下 *** 作: >使用operator []从地图中检索值. >检查返回值,如果为NULL,则使用insert在地图中插入新元素. 奇迹般地,地图中出现了值为0的元素. 经过几个小时的调试后,我发现了以下内容:map的operator [] inserts a new element if the key is not found,插入does not change the value 我的代码执行了以下 *** 作:

>使用operator []从地图中检索值.
>检查返回值,如果为NulL,则使用insert在地图中插入新元素.

奇迹般地,地图中出现了值为0的元素.

经过几个小时的调试后,我发现了以下内容:map的operator [] inserts a new element if the key is not found,插入does not change the value if the key exists.

即使映射值类型的默认构造函数不存在,代码也会编译,而operator []会插入0.

有没有办法(比如我现在可以遵循的一些编码惯例)我可以防止这种伤害我?

解决方法

Is there a way (e.g. some Coding convention I Could follow from Now on) I Could have prevented this from hurting me?

这可能听起来很讽刺,但是:通过阅读文档.

既然你所做的是某种预期的地图行为,你就无法防范它.

您可以注意的一件事是以下内容.在第二步中,你做错了什么:

Check the return value and if NulL use insert to insert a new element in the map.

这对C标准库函数(C兼容函数和新函数除外)不起作用:标准库不处理指针,至少处理所有空指针,因此检查NulL(或0或nullptr)很少有意义. (除此之外,map的operator []首先返回一个指针是没有意义的.它显然返回了元素类型(或者更确切地说是对它的引用)).

实际上,标准库主要使用迭代器,所以如果有的话,通过与容器的end()进行比较来检查迭代器的有效性.

不幸的是,从NulL编译的代码(检查为NulL)实际上是一个在C中等于0的宏,因此您可以将它与整数进行比较.

通过引入具有不同类型的nullptr关键字,C 11变得更安全,因此将其与整数进行比较将无法编译.所以这是一个有用的编码约定:永远不要使用NulL,而是在启用C 11支持的情况下编译并使用nullptr.

总结

以上是内存溢出为你收集整理的C:如何阻止map的operator []插入虚假值?全部内容,希望文章能够帮你解决C:如何阻止map的operator []插入虚假值?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1223810.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存