作者:平凡无求 | 来源:互联网 | 2023-05-17 09:10
我想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
ID DataSet
,清除DataSet
,并获得大小DataSet
.
我希望(并且我需要)在我的DataSet
班级中使用的结构是一个std::unordered_map
.对于这个映射,我希望键是与a关联的整数id Object
,而实际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 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(*this)(__x.__cc.first);}
我最终希望能够做的是在另一个名为的文件中driver.cpp
,有一个for循环,它将增加数百万Object
s.它看起来像这样:
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> emlai..:
您需要将散列函数定义为const
调用操作符(即operator()
),它接受键类型的对象并返回size_t
:
size_t operator()(int x) const { ... }