如何正确使用unordered_map C ++

时间:2015-03-21 00:13:31

标签: c++ c++11 dictionary hashmap

我想创建一个带有自定义哈希函数的std::unordered_map。我无法确定在哪里声明/如何使用我的unordered_map

情况如下。我有一个名为Object的班级。它非常简单,只包含一个整数id。这是头文件:

// Object.hpp
class Object {
    public:
        Object();
        ~Object(){};
        int   Id();
        void setId(int i);
    private:
        int id;
};

我有一个名为DataSet的类,它充当容器,可容纳数百万Object个。为了简单起见,我只希望能够构建DataSet,向Object添加DataSet,从Object中删除DataSet ID ,清除DataSet,并获取DataSet的大小。

我希望(并且我需要)在我的DataSet课程中使用的结构是std::unordered_map。对于此映射,我希望键是与Object关联的整数id,而实际的Object*本身是值。最后我有这个哈希函数,我想用于unordered_map。以下是我目前在DataSet头文件中的内容:

// DataSet.hpp
struct HashKey {
    unsigned int hash(unsigned int x) {
        x = ((x >> 16) ^ x) * 0x45d9f3b;
        x = ((x >> 16) ^ x) * 0x45d9f3b;
        x = ((x >> 16) ^ x);
        return x;
    }
};

class DataSet{

public:
    std::unordered_map<int,Object*,HashKey> objects;

    DataSet();
    ~DataSet();

    int addObject(Object *object);
    void clear();
    int deleteObject(int id);
    int getSize();
};

截至目前,我只想弄清楚如何在addObject中创建DataSet.cpp。这是我的(破碎)尝试:

int DataSet::addObject(Object *object)
{
    objects.emplace(object->Id(),object);
    return 1;
}

编译时,我最终得到了这个错误:

type 'const HashKey' does not provide a call operator
        {return static_cast<const _Hash&>(*this)(__x.__cc.first);}

我最终希望能够做的是在另一个名为driver.cpp的文件中,有一个for循环,可以添加数百万Object个。它看起来像这样:

DataSet container;
for(int i = 0; i < 10000000; ++i) {
    Object *object = new Object();
    object->setId(i);
    container.addObject(object);
}

有没有办法制作unordered_map以便我能做到这一点?作为旁注,我需要使用当前的DataSet类和当前的Object类。我只需要为它做一个std::unordered_map

1 个答案:

答案 0 :(得分:5)

您需要将哈希函数定义为const 调用运算符(即operator()),其中包含键类型的对象和返回size_t

size_t operator()(int x) const { ... }