gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:26:05 28 4
gpt4 key购买 nike

我的代码做了以下事情:

  1. 使用 operator[]map 中检索值。
  2. 检查返回值,如果 NULL 使用 insert 在 map 中插入一个新元素。

神奇的是,一个值为 0 的元素出现在 map 中。

经过几个小时的调试,我发现了以下内容:mapoperator[] 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?

这可能听起来很尖刻,但是:通过阅读文档。

由于您所做的在某种程度上是 map 的预期行为,因此您无能为力。

您将来可以注意的一件事如下。在你的第二步,你做错了什么:

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

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

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

不幸的是,自 NULL 以来编译的代码(检查 NULL)实际上是一个等于 C++ 中的 0 的宏,因此您可以比较它反对一个整数。

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

关于C++:如何阻止 map 的 operator[] 插入虚假值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10684888/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com