C++ 我可以使用成员变量作为散列集/散列映射的键吗?

C++ 我可以使用成员变量作为散列集/散列映射的键吗?,c++,hash,hashmap,C++,Hash,Hashmap,我有一门课是这样的: class Foo { long long Id; string x; string y; // other member variables and functions }; 我想将其存储在散列集(或散列映射)中,但使用Id成员变量作为插入和搜索的键。我不知道该怎么做。我想到了以下几种方法,但都不是很好: 1) 我可以编写一个自定义哈希函数,使用Id对对象进行哈希,但是我不能使用hash\u set上的find()方法按Id(long)查找项,因

我有一门课是这样的:

class Foo
{
   long long Id;
   string x;
   string y;
   // other member variables and functions
};
我想将其存储在
散列集
(或
散列映射
)中,但使用Id成员变量作为插入和搜索的键。我不知道该怎么做。我想到了以下几种方法,但都不是很好:

1) 我可以编写一个自定义哈希函数,使用Id对对象进行哈希,但是我不能使用
hash\u set
上的
find()
方法按Id(
long
)查找项,因为它需要传入
Foo
对象

2) 我可以复制Id并创建一个
hash\u映射
,而不是
hash\u集
,但是我有1亿个这些对象的实例,所以我不想复制Id字段

3) 我可以将Id字段移到
Foo
之外,然后执行
hash\u-map
,但这会有点混乱,因为Id是由类内部使用的,最好将其与
Foo
一起保存

有什么想法吗?我正在寻找的是一种存储
Foo
对象的方法,但可以使用
long
(按Id)在
hash\u集中搜索它们


谢谢

这可能不是一个特别优雅的解决方案,但它是有效的:定义一个
操作符
1) 我可以编写一个自定义哈希函数
这将使用
Id,但我不能使用find()命令
方法,以查找该项
通过Id(长时间),因为它将
要求传入一个Foo对象


这是标准映射和集合容器的常见问题。添加创建比较对象的构造函数或静态成员,该对象只有关键成员有效。

选项2是您给出的三个选项中的最佳选项。如果你能胜任,你可以编写一个定制的hash_集(甚至只是普通hash_集的包装器)来提供你想要的。那样的话,我更喜欢选项1。您可以轻松添加一个只接受键值的查找函数,并对其进行调整以正确使用内部查找函数,从而为您带来所有好处。

我对它没有太多经验,但boost::multiindex默认构建在boost::hash之上,并且只使用在对象中找到的一个键来查找散列中的对象。“如果您没有找到哈希集/哈什映射容器的实际解决方案,您可能需要考虑使用哈希表实现,它直接支持您的用例。虽然它是C语言,并且基于宏,但它是目前最流行的哈希表实现之一。

对于标准集或映射非常有效,而对于基于哈希的容器则不太有效。
操作符为什么不能?我认为基于散列的容器仍然依赖于
操作符
散列映射
无序映射
似乎采用了一个比较函子来表示相等,不少于。似乎
无序映射
使用
相等映射
进行比较,但至少VC++的
hash\u映射
使用了
hash\u比较
。只需重载相等运算符即可。对于散列函数本身,只需返回id。这个函数的使用模式是什么?您是设置一次,然后仅从中读取,还是继续修改设置?