关于模板专业化

时间:2011-01-19 09:15:21

标签: c++ templates operator-overloading template-specialization

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

2 个答案:

答案 0 :(得分:1)

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

如果你的hash_table有operator [],那么你可以是一个hash_map,你可以在那里向operator []提供密钥,也可以是operator []返回一个单元格的内容。

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

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

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

答案 1 :(得分:0)

  

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

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

正如“CashCow”所指出的那样,字节数组上的operator[]与哈希表上的{{1}}之间没有固有的冲突......如果需要,它们甚至可以被链接。