2

我需要为哈希表提供插入/查找/删除接口。我编写哈希表只是为了提供内部存储桶/条目管理。散列函数应该从外部提供。我现在被困在如何公开接口上,以便哈希表可以处理字节数组以及固定长度的数据类型。问题是对于字节数组,散列函数需要知道数组的长度,而对于其他类型,它可以不需要这些信息。我的问题是我无法实现operator[]字节数组,因为哈希函数需要两个参数。我想好好operator[]珍惜。有没有办法解决这个问题(没有专门针对该专门化T*并抛出编译器错误operator[]。)?

4

2 回答 2

1

我在这里感到困惑,因为我没有得到哈希表上的 operator[] 与您存储在其中的数据类型上的 operator[] 冲突的位置。

如果您的 hash_table 有 operator[] 这可能是一个 hash_map,您可以在其中向 operator[] 提供密钥,也可能是 operator[] 返回单元格的内容。

通常,如果我实现自己的哈希表,我不会直接将数据存储在条目中,而是将数据加上一些“元数据”,即与单元格相关的信息。由于您的哈希表支持删除,您需要确保您仍然可以到达任何可能被移动到其他地方的冲突,无论您现在的策略是找到这样一个单元格。因此,已删除的单元格可用,但与从未被占用的单元格具有不同的含义,因为它可能是碰撞过程中路径的一部分。

正如您所说,哈希函数是独立的。因此它独立于存储机制,根本不调用哈希表的 operator[]。

哈希表仅使用哈希函数和比较函数,否则使用自己的存储策略和冲突处理策略。

于 2011-01-19T09:39:13.453 回答
0

可以处理字节数组以及固定长度的数据类型

因此,您的字节数组的大小会有所不同。您需要记录每个地方的长度。如果您想按值将它们存储在哈希表中,那么您可以将数据和长度值打包在一个对象中:STL 已经提供了一些适用于此的类,包括 std::vector<> 和 std::string< >。或者,如果您只希望哈希表存储对字节数组的指针/引用,那么您可以创建一个简单的“句柄”类,该类存储或知道在哪里找到长度,并具有对数据的指针/引用。

正如“CashCow”所指出的,operator[]字节数组和哈希表之间没有内在的冲突……如果需要,它们甚至可以链接起来。

于 2011-01-19T10:00:38.567 回答