【发布时间】:2010-04-26 07:26:16
【问题描述】:
我想在 C++ 中实现某种查找表,作为缓存。它旨在模拟我正在模拟的一个硬件。
键是非整数,所以我猜散列是有序的。我无意发明轮子,所以我打算为此使用std::map(尽管欢迎提出替代方案的建议)。
问题是,有没有办法限制散列的 size 以模拟我的硬件大小有限的事实?我希望哈希的 insert 方法在达到限制时返回错误消息或抛出异常。
如果没有这样的方法,我会在尝试插入之前简单地检查它的大小,但这似乎是一种不雅的方法。
【问题讨论】:
-
你可以做的是抛出
bad_alloc,这可以通过实现你自己的分配器来完成。这就是您所需要的:stackoverflow.com/questions/1591591/… -
地图是一棵树,而不是哈希表结构。它将允许查找,但会在
O(log N)中搜索(与O(1)相比,以获得最佳哈希) -
@David:只要实现满足该类型的 STL 复杂性要求,就可以按照作者的选择来实现映射。最好不要想象给定的 STL 类型以任何特定的方式实现 - 复杂性要求都是可以保证的。
-
@Nick,我知道标准不需要具体的数据结构,但是评论中对时间复杂度的要求成立:地图中的查找操作是标准中的
O(log N)。这也是一个事实,所有现有的 STL 实现都在内部使用树来映射映射(因此,即使从理论的角度来看,蕴含 map => tree 不成立,但从实用的角度来看它确实如此)。部分原因是很难提出一个不同的数据结构来满足标准对所有操作的所有要求。 -
@Nick:哈希表要求键是可哈希的;树要求键是有序的。 C++ 标准确实要求
std::map键是可排序的,但不要求它们是可散列的。此外,std::map上的迭代必须以该精确排序顺序迭代所有键。因此,我们可以肯定地说,该标准不允许std::map成为哈希表。