如何正确使用unordered_map C++
How to correctly use an unordered_map C++
我想创建一个带有自定义哈希函数的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
,向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 循环,可以添加数百万个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
。
您需要
将哈希函数定义为const
调用运算符(即 operator()
( 获取键类型的对象并返回size_t
:
size_t operator()(int x) const { ... }
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射