我想在C ++中实现某种用作缓存的查找表。它旨在模拟我正在模拟的硬件。
密钥是非整数的,所以我猜测哈希是有序的。我无意发明轮子,因此我打算使用std::map
(尽管欢迎提出替代方案的建议)。
问题是,有没有办法限制哈希的 size 以模拟我的硬件是有限大小的事实?我希望哈希的 insert 方法返回错误消息,或者在达到限制时抛出异常。
如果没有这种方法,我会在尝试插入之前检查它的大小,但这似乎是一种不太优雅的方式。
答案 0 :(得分:9)
首先,map
结构不是hash table
,而是平衡的二叉树。对于最佳哈希实现,这会对查找时间O(log N)
而不是O(1)
产生影响。这可能会或者不会影响您的问题(如果实际键和操作的数量很小就足够了,但缓存的模拟可能在某种程度上不是最理想的。
您可以做的最简单的解决方案是将实际数据结构封装到一个类中,该类检查每个插入的大小(大小查找应该在所有STL实现中以恒定时间实现)并且如果失败则你试图添加太多元素。
class cache {
public:
static const int max_size = 100;
typedef std::map<key_t, value_t> cache_map_t;
void add( key_t key, value_t value ) {
cache_map_t::const_iterator it = m_table.find( key );
if ( it != m_table.end() && m_table.size() == max_size ) {
// handle error, throw exception...
} else {
m_table.insert( it, std::make_pair(key,value) );
}
}
private:
cache_map_t m_table;
};
// Don't forget, in just one translation unit:
const int cache::max_size;
答案 1 :(得分:4)
无法“自动”限制std::map
的大小,只是因为“有限std::map
”不再是std::map
。
将std::map
包装在您自己的类中,在插入之前将std::map
的大小与常量进行比较,并在达到最大大小的情况下执行任何操作。
答案 2 :(得分:2)
如果您正在实施LRU缓存或类似内容,我发现boost::bimap非常宝贵。使用一个索引作为主“对象ID”键(如果您有简单的对象枚举,则可以是高效的矢量视图),另一个索引可以是有序的时间戳。