代码之家  ›  专栏  ›  技术社区  ›  jdt141

将std::map用作关联数组

  •  1
  • jdt141  · 技术社区  · 16 年前

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

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

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

    CustomClass* pClass = CustomContainer[ID]
    

    约瑟提斯说:

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

    映射值的类型为CustomClass*。该值将默认为空,还是未定义?(我认为不会,因为“指针”不是基本数据类型)。我认为它也会在一定程度上依赖于构造函数和那里的行为。思想????

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

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

    多谢!

    4 回复  |  直到 16 年前
        1
  •  13
  •   Pavel Minaev    16 年前

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

    当你使用 operator[] 在地图上,它会创建一个新条目, 默认值已初始化 . 这意味着指针的指针值为空(0表示 int S等。它永远不会是未定义的。

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

        2
  •  9
  •   Mark Ransom    16 年前

    使用map::find代替并完全避免这个问题。

    std::map<int, CustomClass*>::iterator i = CustomContainer.find(ID);
    if (i != CustomContainer.end())
    {
        CustomClass* pClass = i->second;
        ...
    
        3
  •  4
  •   Community Mohan Dere    9 年前
        4
  •  0
  •   daveg    16 年前

    您的映射包含customClass*,因此对customContainer[newid]的调用构造一个指针,而不是customClass的实例。 指针的值将是未定义的-即使幸运的是它最初是空的,您也不应该真正依赖于这种行为。

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

    您可以这样测试映射中是否存在ID:

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