【发布时间】:2015-03-21 00:13:31
【问题描述】:
我想创建一个带有自定义哈希函数的std::unordered_map。不过,我无法弄清楚在哪里声明/如何使用我的unordered_map。
情况是这样的。我有一门课叫Object。它超级简单,只包含一个整数id。这是头文件:
// Object.hpp
class Object {
public:
Object();
~Object(){};
int Id();
void setId(int i);
private:
int id;
};
我有一个名为DataSet 的类,它充当一个容器,可以容纳数百万个Objects。为简单起见,我只想能够构造一个DataSet,在DataSet 中添加一个Object,从DataSet 中按ID 删除一个Object,清除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();
};
目前我只是想弄清楚如何在DataSet.cpp 中创建addObject。这是我的(破碎的)尝试:
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 循环将添加数百万个 Objects。它看起来像这样:
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。
【问题讨论】:
-
哈希必须定义
op()
标签: c++ c++11 dictionary hashmap