如何正确使用 unordered_map C++
How to correctly use an unordered_map C++
我想创建一个带有自定义哈希函数的 std::unordered_map
。不过,我无法弄清楚在哪里 declare/how 使用我的 unordered_map
。
情况是这样的。我有一个名为 Object
的 class。它非常简单,只包含一个整数 id
。这是头文件:
// Object.hpp
class Object {
public:
Object();
~Object(){};
int Id();
void setId(int i);
private:
int id;
};
我有一个名为 DataSet
的 class,它充当一个容器,可以容纳数百万个这样的 Object
。为了简单起见,我只希望能够构造一个 DataSet
,将一个 Object
添加到 DataSet
,从 DataSet
中删除一个 ID 的 Object
,清除DataSet
,得到DataSet
的大小。
我想(并且必须)在我的 DataSet
class 中使用的结构是一个 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 循环将添加数百万个 Object
s。它看起来像这样:
DataSet container;
for(int i = 0; i < 10000000; ++i) {
Object *object = new Object();
object->setId(i);
container.addObject(object);
}
有什么方法可以让 unordered_map
完成吗?作为旁注,我需要按原样使用当前的 DataSet
class 和当前的 Object
class。我只需要为它制作一个std::unordered_map
。
您需要将散列函数定义为 const
调用运算符 (即 operator()
),它采用 的对象键类型 和 returns size_t
:
size_t operator()(int x) const { ... }
我想创建一个带有自定义哈希函数的 std::unordered_map
。不过,我无法弄清楚在哪里 declare/how 使用我的 unordered_map
。
情况是这样的。我有一个名为 Object
的 class。它非常简单,只包含一个整数 id
。这是头文件:
// Object.hpp
class Object {
public:
Object();
~Object(){};
int Id();
void setId(int i);
private:
int id;
};
我有一个名为 DataSet
的 class,它充当一个容器,可以容纳数百万个这样的 Object
。为了简单起见,我只希望能够构造一个 DataSet
,将一个 Object
添加到 DataSet
,从 DataSet
中删除一个 ID 的 Object
,清除DataSet
,得到DataSet
的大小。
我想(并且必须)在我的 DataSet
class 中使用的结构是一个 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 循环将添加数百万个 Object
s。它看起来像这样:
DataSet container;
for(int i = 0; i < 10000000; ++i) {
Object *object = new Object();
object->setId(i);
container.addObject(object);
}
有什么方法可以让 unordered_map
完成吗?作为旁注,我需要按原样使用当前的 DataSet
class 和当前的 Object
class。我只需要为它制作一个std::unordered_map
。
您需要将散列函数定义为 const
调用运算符 (即 operator()
),它采用 的对象键类型 和 returns size_t
:
size_t operator()(int x) const { ... }