2010-09-25 55 views
1

我需要使用多个键(int类型)来存储和检索哈希表中的单个值。我会使用多个键索引单个项目。我需要快速插入并查找散列表。顺便说一句,我不允许在实现中使用Boost库。多键哈希表(unordered_map)

我该怎么做?

谢谢。

+0

当你说多个键时,你的意思是每个键都必须单独索引相同的项目,还是你的意思是多个整数都用于索引单个项目? (也就是说,当你做查找时,你是否提供了一个或所有的多个密钥?) – 2010-09-25 17:41:12

+0

感谢您的快速回复。我会使用多个键索引单个项目。 – Ashley 2010-09-25 17:47:04

回答

1

最简单的方法可能是保留指向列表中元素的指针/索引映射。

虽然需要一些更多细节,但是您需要支持删除吗?元素如何设置?你可以使用boost :: shared指针吗? (相当有帮助,如果你需要支持删除)

我假设在这种情况下值对象很大,或者有一些其他原因,你不能简单地复制常规地图中的值。

2

如果你的意思是两个整数形成一个单一的密钥,然后unordered_map<std::pair<int,int>, value_type>。如果您想通过多个键索引相同的一组数据,请查看Boost.MultiIndex

+0

这不起作用。我试过了。它说:散列并不专门用于这种类型 – off99555 2016-04-04 08:38:53

+0

@ off99555如果你定义了一个自定义散列函数,它将起作用。请参阅,例如,http://stackoverflow.com/questions/17016175/c-unordered-map-using-a-custom-class-type-as-the-key – orizon 2016-07-01 20:47:15

2

如果关键看你的容器由多个int S上的结合,你可以使用boost::tuple作为你的钥匙,而不需要您更多的工作来封装int秒。如果您的密钥int子组件的数量已修复,则此项保持不变。

+0

感谢您的回复。我更新了关于我不允许使用Boost库的问题。 – Ashley 2010-09-25 17:51:26

+0

@Ashley - 为什么不呢?如果没有Boost,你就不能随时访问unordered_map。 – 2010-09-25 17:54:00

+0

我认为我目前可以访问的unordered_map是GNU C++库的实现。 – Ashley 2010-09-25 18:00:51

0

如果它总是用于检索的组合。

然后它更好地使用多个密钥形成单个复合密钥。

你可以做到这一点无论

  1. 保存像是

    (int1,int2,int3) => data 
    
  2. 的关键是整数的一个连接字符串使用像uint64_t中更高的数据类型,其中以U可以添加单独的值以形成一把钥匙

    // Refer comment below for the approach 
    
+0

方法#2很好,更好的解释请参见http://stackoverflow.com/questions/3761914/storing-and-retrieving-multiple-keys-in-c/3762694#3762694;公式似乎是不正确的,它可能是(假设'N'是以位为单位的int宽度):'((int1 << 2 * N)+(int2 << N)+ int3)'提供的'数据' 3 * N'位。 – Arun 2010-09-25 19:50:24