使用std :: map作为关联数组

jdt*_*141 1 c++ stl

所以,我使用std :: map作为关联数组.地图声明如下:

std::map<int, CustomClass*> CustomContainer;
Run Code Online (Sandbox Code Playgroud)

稍后,我使用CustomContainer对象作为关联数组,例如,

CustomClass* pClass = CustomContainer[ID]
Run Code Online (Sandbox Code Playgroud)

Josuttis说:

如果使用键作为索引,但尚未存在任何元素,则会自动将新元素插入到地图中.new元素的值由其类型的默认构造函数初始化.因此,要使用此功能,您不能使用没有默认构造函数的值类型

地图的值是CustomClass*类型.该值是默认为NULL,还是未定义?(我认为它不会,因为"指针"不是基本的数据类型).我认为它也会依赖于构造函数和那里的行为....思想???

CustomClass的唯一构造函数如下所示:

CustomClass::CustomClass(ClassA param1, ClassB param2, ClassC param3, ClassD param4)
:privateClassA(param1),
privateClassB(param2),
privateClassC(param3),
privateClassD(param4)
{

}
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Pav*_*aev 13

未初始化的本地指针变量或字段将具有未定义的值,就像未初始化int(或通常为POD类型)的局部变量或字段一样.但是,这与手头的问题无关.

operator[]在地图上使用时,它会创建一个新条目,它是默认初始化的.这意味着指针的空指针值(对于ints表示0 ,依此类推).它永远不会被定义.

如果您确实需要检查地图中是否存在具有此类键的项目,并且不想要新条目,请使用find()成员函数,并将返回的迭代器进行比较end().


Mar*_*som 9

请改用map :: find并完全避免问题.

std::map<int, CustomClass*>::iterator i = CustomContainer.find(ID);
if (i != CustomContainer.end())
{
    CustomClass* pClass = i->second;
    ...
Run Code Online (Sandbox Code Playgroud)