2

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

回答

1

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

如果你的hash_table有operator [],它可能是你为key []提供密钥的hash_map,也可能是那个operator []返回一个单元格的内容。

通常,如果我确实实现了自己的散列表,我并不直接将数据存储在条目中,而是将数据加上一些“元数据”,即与单元有关的信息。由于你的散列表支持删除,所以你需要确保你仍然可以达到可能被移动到别处的任何冲突,无论你现在的策略是寻找这样一个单元。因此,删除的单元格可用,但与从未占用过的单元格有不同的含义,因为它可能是碰撞过程中路径的一部分。如你所说,散列函数是独立的。它独立于存储机制,并且根本不调用哈希表的operator []。

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

+0

+1。我猜哈希表不应该知道密钥的字节布局。我将为字节数组键实现一个包装类。 – nakiya 2011-01-19 09:56:03

0

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

所以,你的字节数组的大小而变化。你需要记录每个地方的长度。如果你想通过值将它们存储在哈希表中,那么你可以将数据和长度值打包在一个对象中:STL已经提供了一些类适用于这个类,包括std :: vector和std :: string < >。或者,如果您只希望哈希表存储指向您的字节数组的指针/引用,则可以创建一个普通的“句柄”类,它可以存储或知道在哪里查找长度,并且具有指向/指向数据的指针/引用。

正如“CashCow”指出的,字节数组上的operator[]与散列表上的operator[]之间没有固有冲突......如果需要,它们甚至可以链接在一起。