有没有办法限制STL地图的大小?

时间:2010-04-26 07:26:16

标签: c++ stl map

我想在C ++中实现某种用作缓存的查找表。它旨在模拟我正在模拟的硬件。

密钥是非整数的,所以我猜测哈希是有序的。我无意发明轮子,因此我打算使用std::map(尽管欢迎提出替代方案的建议)。

问题是,有没有办法限制哈希的 size 以模拟我的硬件是有限大小的事实?我希望哈希的 insert 方法返回错误消息,或者在达到限制时抛出异常。

如果没有这种方法,我会在尝试插入之前检查它的大小,但这似乎是一种不太优雅的方式。

3 个答案:

答案 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”键(如果您有简单的对象枚举,则可以是高效的矢量视图),另一个索引可以是有序的时间戳。