带有自定义类的无序映射

Unordered Map with a custom class

本文关键字:无序 映射 自定义      更新时间:2023-10-16
我是新来的,这是我的第一个问题。(我在这个网站上找到了一些问题的答案,但我不明白他们的意思,因为我的答案有点不同。)让我先给你看一些代码:这是我的类:
class citems{
public:
    char* name;
    int colorR;
    int colorG;
    int colorB;
    int type;
citems(char* name, int colorR, int colorG, int colorB, int type)
{
    this->name = name;
    this->colorR = colorR;
    this->colorG = colorG;
    this->colorB = colorB;
    this->type = type;
}
};

然后我将创建一个类似于这样做的函数,但是有一个长列表:

citems getObjectFromId(int ID)
{
static unordered_map <int, citems> item;
static bool init = false;
if (!init)
{
item[123546]= citems("Name", 181,179, 0, 9);
init = true;
}
return item[ID];
}

所以我可以调用项目ID,并在任何时候获得单独的颜色,类型和名称。到目前为止一切正常,但是当我编译时,我得到这个错误:

c:program files (x86)microsoft visual studio11.0vcincludeunordered_map(239):错误C2228: left of '。首先必须有class/struct/union

所以我读我必须让我自己的EqualOperator或类似的东西,但我似乎无法从它得到一个逻辑。

对于T& operator[]( const Key& key )映射类型必须满足DefaultConstructible要求。这意味着你的类citems需要一个默认构造函数:

class citems{
public:
    //...
    /* possible form 1 */
    citems() {
    }
    /* possible form 2 ( default parameter values)*/
    citems( char* name = 0, int colorR = -1, int colorG = -1,
                              int colorB = -1, int type = -1) {
    }
};

还需要注意的是,T& operator[]( const Key& key )返回一个值的引用,该值被映射到与key等价的键,如果该键不存在则执行插入。如果您不想在映射中没有给定键时插入新元素,但要更改现有的元素-您必须首先使用find()insert()插入检查该元素是否存在于映射上。