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

Chr*_*urm 3 c++ stl map

我的代码执行了以下操作:

  1. mapwith中检索值operator[].
  2. 检查返回值以及是否NULL用于insert在地图中插入新元素.

神奇地,有价值的元素0出现在地图中.

几个小时的调试后,我发现了以下内容:mapoperator[] 插入一个新的元素,如果未找到该键,而insert 如果该键存在并不会改变价值.

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

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

unw*_*ind 7

我想显而易见的是要知道那些确实是索引操作符的语义,所以你不应该用它来测试容器中的元素存在.

相反,使用find().


Kon*_*lph 6

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

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

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

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

检查返回值,如果为NULL,则使用insert在地图中插入新元素.

但这从来没有与C++标准库函数(除C兼容功能的其它携手new):标准库没有在指针处理,至少所有的空指针的,所以对检查NULL(或0nullptr)很少是有道理的.(除此之外,地图operator []首先返回指针是没有意义的.它显然返回元素类型(或者更确切地说是对它的引用)).

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

不幸的是,你NULL编译的代码(检查)NULL实际上是一个与0C++ 相同的宏,因此你可以将它与一个整数进行比较.

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