我可以使用成员变量作为hash_set / hash_map的键吗?

时间:2010-10-11 17:42:42

标签: c++ hash hashmap

我有一个这样的课程:

class Foo
{
   long long Id;
   string x;
   string y;
   // other member variables and functions
};

我想将其存储在hash_set(或hash_map)中,但使用Id成员变量作为插入和搜索的键。我不知道怎么能这样做。我想到了以下方法,但没有一个真的很好:

1)我可以编写一个自定义哈希函数,使用Id对对象进行哈希处理,但是我不能使用find()上的hash_set方法通过Id查找项目({{ 1}})因为它需要传入long long个对象。

2)我可以复制ID并创建Foo而不是hash_map<long long, Foo>,但我有1亿个这些对象的实例,所以我宁愿不复制Id字段。

3)我可以在hash_set<long long, Foo>之外移动Id字段,然后执行Foo,但由于ID在课堂内部使用,因此它会有点混乱,最好保留它与hash_map<long long, Foo>

有什么想法吗?我正在寻找的是一种存储Foo个对象的方法,但能够使用Foo(通过ID)在hash_set中搜索它们。

谢谢!

5 个答案:

答案 0 :(得分:0)

这可能不是一个特别优雅的解决方案,但它可行:为您的类定义operator <(以及[{1}},如CashCow建议的那样),根据{{1}对订单进行排序} field,然后当你想要operator ==时,传入一个包含你正在寻找的Id的虚拟对象。

答案 1 :(得分:0)

  

1)我可以编写自定义哈希函数   将使用的哈希对象   Id,但后来我不能使用find()   hash_set上的方法来查找项目   由Id(长期),因为它会   要求传入Foo对象。

这是标准地图和集合容器的常见问题。添加一个构造函数或静态成员,用于创建一个比较对象,一个只有密钥成员有效的对象。

答案 2 :(得分:0)

选项2是你给出的三个中最好的选择。如果你能做到这一点,你可以编写一个自定义的hash_set(甚至只是常规的一个包装器)来提供你想要的东西。在这种情况下,我更喜欢选项1.您可以轻松添加一个只获取键值的查找功能,并使其适应使用内部查找功能,为您提供所有好处。

答案 3 :(得分:0)

我对它没有多少经验,但是boost :: multiindex是默认构建在boost :: hash之上的,并且明确支持仅使用对象中找到的键在哈希中查找对象

答案 4 :(得分:0)

如果没有找到hash_set / hash_map容器的实际解决方案,您可能需要考虑使用uthash哈希表实现,它直接支持您的用例。虽然它是C,但它基于宏,但它是最流行的哈希表实现之一。