简洁高效的LRU Map C++实现

LRU是缓存替换的一个重要原则。其思想可以广泛的应用于很多场合。通过维护一个Key和Timestamp之间的双向映射,可以实现一个简洁高效的通用LRU Map。

   1: #include <map>
   2: #include <string>
   3: #include <iostream>
   4: using namespace std;
   5:  
   6:  template<class K, class V>
   7:  struct lrumap:public map<K, V> 
   8:  {
   9:      typedef map<K, V> base_type;
  10:      typedef size_t timestamp;
  11:      typedef typename map<K, timestamp> K2T;
  12:      typedef typename map<timestamp, K> T2K;
  13:   
  14:      K2T k2t; // from key to timestamp
  15:      T2K t2k; // from timestamp to key
  16:   
  17:      timestamp tm;
  18:      size_type capacity;
  19:      lrumap(size_type cap=10)
  20:          : tm(1), capacity(cap) {}
  21:   
  22:      V& operator[](const K& k)
  23:      {
  24:          timestamp& _tm=k2t[k];
  25:          if(_tm) // if the timestamp already exist, delete it from t2k
  26:              t2k.erase(_tm);
  27:          _tm=tm++; // update timestamp in k2t
  28:          t2k[_tm]=k; // update key in t2k
  29:   
  30:          V& ret= base_type::operator[](k);
  31:   
  32:          // remove the oldest if necessary
  33:          if(size()>capacity)
  34:          {
  35:              K k=t2k.begin()->second; // get the eldest key
  36:              erase(k);
  37:          }
  38:          return ret;
  39:      }
  40:      void erase(const K& k)
  41:      {
  42:          // erase timestamp <-> key reference
  43:          t2k.erase(k2t[k]);
  44:          k2t.erase(k);
  45:          // then the actual data
  46:          base_type::erase(k);
  47:      }
  48:  };

在这个实现中,当lrumap增长到等于capacity时,会出现频繁的在map中插入/删除节点的情况。大量的动态内存分配/释放会严重影响程序性能。配合pool_allocator会大大的提高这个LRU map的性能,使其成为一个真正有用的LRU map。

转载于:https://www.cnblogs.com/tactoth/archive/2009/09/29/1576319.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值