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

时间:2009-10-08 20:22:00

标签: c++ stl

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

std::map<int, CustomClass*> CustomContainer;

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

CustomClass* pClass = CustomContainer[ID]
乔斯特斯说:

  

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

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

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

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

}

非常感谢!

4 个答案:

答案 0 :(得分:13)

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

在地图上使用operator[]并创建新条目时,它是默认初始化。这意味着指针的空指针值(对int s为0,依此类推)。它永远不会被定义。

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

答案 1 :(得分:9)

使用map :: find来完全避免这个问题。

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

答案 2 :(得分:4)

它将是一个NULL指针:what-is-the-default-constructor-for-c-pointer

答案 3 :(得分:0)

您的地图持有CustomClass *,因此对CustomContainer [newID]的调用会构造一个指针,而不是CustomClass的实例。 指针的值将是未定义的 - 即使你很幸运,它最初也是NULL,你不应该真正指望这种行为。

是的,我最后一部分错了。

您可以通过这种方式测试地图中是否存在ID:

(CustomContainer.find(someID) == map<int,CustomClass>::end)