简单LRU算法实现的Cache(C++)
来源:互联网 发布:nginx代理上网 编辑:程序博客网 时间:2024/06/07 00:32
#pragma once#include <map>#include <time.h>template<typename CacheKey, typename CacheValue>class LRUCache{public:LRUCache(void);LRUCache(int capacity);~LRUCache(void);void Put(const CacheKey & key, const CacheValue & value);bool Get(const CacheKey & key, CacheValue & value);void Remove(const CacheKey & key);unsigned int Size();private:void removeRencentlyLeastAccess();private:typedef struct tagValueEntry {CacheValue Value;int Count;long LastAccess;} ValueEntry;typedef typename std::map<CacheKey, ValueEntry> Cache;typedef typename Cache::iterator CacheItr;Cache m_Cache;unsigned int m_CacheSize;const static int DefautCacheSize = 100;const static long MiniAccess = 20;};template<typename CacheKey, typename CacheValue>LRUCache<CacheKey, CacheValue>::LRUCache(void) : m_CacheSize(DefautCacheSize){}template<typename CacheKey, typename CacheValue>LRUCache<CacheKey, CacheValue>::LRUCache(int capacity) : m_CacheSize(capacity){}template<typename CacheKey, typename CacheValue>LRUCache<CacheKey, CacheValue>::~LRUCache(void){}template<typename CacheKey, typename CacheValue>void LRUCache<CacheKey, CacheValue>::Put(const CacheKey & key, const CacheValue & value){if(m_Cache.size() >= m_CacheSize){removeRencentlyLeastAccess();}ValueEntry entry;entry.Value = value;entry.Count = 1;entry.LastAccess = clock();m_Cache.insert(std::make_pair(key, entry));}template<typename CacheKey, typename CacheValue>bool LRUCache<CacheKey, CacheValue>::Get(const CacheKey & key, CacheValue & value){CacheItr itr = m_Cache.find(key);if(itr != m_Cache.end()){value = itr->second.Value;return true;}return false;}template<typename CacheKey, typename CacheValue>void LRUCache<CacheKey, CacheValue>::Remove(const CacheKey & key){CacheItr itr = m_Cache.find(key);if(itr != m_Cache.end()){m_Cache.erase(key);}}template<typename CacheKey, typename CacheValue>unsigned int LRUCache<CacheKey, CacheValue>::Size(){return m_Cache.size();}template<typename CacheKey, typename CacheValue>void LRUCache<CacheKey, CacheValue>::removeRencentlyLeastAccess(){long earliest = 0;const CacheKey * ToBeRemovedByTime;int least = 0;const CacheKey * ToBeRemovedByCount;CacheItr itr = m_Cache.begin();if(itr != m_Cache.end()){earliest = itr->second.LastAccess;ToBeRemovedByTime = &(itr->first);least = itr->second.Count;ToBeRemovedByCount = &(itr->first);for(;itr != m_Cache.end();++itr){if(earliest > itr->second.LastAccess){ToBeRemovedByTime = &(itr->first);}if(least > itr->second.Count){ToBeRemovedByCount = &(itr->first);}}if (least > MiniAccess) {m_Cache.erase(*ToBeRemovedByTime);} else {m_Cache.erase(*ToBeRemovedByCount);}}}
原文地址:
http://blog.csdn.net/huyiyang2010/article/details/5827623
0 0
- 简单LRU算法实现的Cache(C++)
- 简单LRU算法实现的Cache(C++)
- 简单LRU算法实现的Cache(C++)
- 简单LRU算法实现的Cache(C++)
- LRU cache的简单实现
- LRU Cache的简单实现
- LRU cache 算法的实现
- 简单LRU cache 实现
- 用LinkedHashMap实现的简单LRU Cache
- LRU Cache的简单c++实现
- LRU cache的一个简单实现
- java实现简单的LRU Cache
- LRU Cache算法实现(leetcode)
- Java实现简单的LRU缓存(A Simple LRU Cache in 5 lines)
- Java实现简单的LRU缓存(A Simple LRU Cache in 5 lines)
- LRU cache的实现
- LRU Cache的实现
- LRU Cache的实现
- Errors running builder 'xx' on project_java
- python使用socket
- 20151201正则第三部分(sed) 最强的功能是替换!
- 使用Alcatraz来管理Xcode插件
- 距离和相似性度量
- 简单LRU算法实现的Cache(C++)
- fvnhsdfhdfsh
- shell脚本调试报错:"syntax error: unexpected end of file"
- MQ入门简介
- Android Studio 快捷键
- 测试代码片
- Spring Http Invoker
- 自动定义瀑布流控件的实现<二>
- Android Studio 中使用github功能