- LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。
- 实现思想:用list保存数据,用unodered_map保存指向list的指针(方便定位查找),和一个数据量的最大值
- 代码如下:
#include<iostream> #include<functional> #include<list> #include<unordered_map> using namespace std; /* * File: lrucache.hpp * Author: Alexander Ponomarev * * Created on June 20, 2013, 5:09 PM */ template<typename key_t, typename value_t> class lru_cache { public: typedef typename std::pair<key_t, value_t> key_value_pair_t; typedef typename std::list<key_value_pair_t>::iterator list_iterator_t; lru_cache(size_t max_size) : _max_size(max_size) { } void put(const key_t& key, const value_t& value) { auto it = _cache_items_map.find(key); _cache_items_list.push_front(key_value_pair_t(key, value)); if (it != _cache_items_map.end()) { _cache_items_list.erase(it->second); _cache_items_map.erase(it); } _cache_items_map[key] = _cache_items_list.begin(); if (_cache_items_map.size() > _max_size) { auto last = _cache_items_list.end(); last--; _cache_items_map.erase(last->first); _cache_items_list.pop_back(); } } const value_t& get(const key_t& key) { auto it = _cache_items_map.find(key); if (it == _cache_items_map.end()) { throw std::range_error("There is no such key in cache"); } else { _cache_items_list.splice(_cache_items_list.begin(), _cache_items_list, it->second); return it->second->second; } } bool exists(const key_t& key) const { return _cache_items_map.find(key) != _cache_items_map.end(); } size_t size() const { return _cache_items_map.size(); } void print() { for (const key_value_pair_t& i : _cache_items_list) { cout << i.first << "---" << i.second << '\t'; } cout << endl; } private: std::list<key_value_pair_t> _cache_items_list; std::unordered_map<key_t, list_iterator_t> _cache_items_map; size_t _max_size; }; int main() { lru_cache<int, int> n_cache(5); n_cache.put(1, 1); n_cache.put(2, 2); n_cache.put(3, 3); n_cache.put(4, 4); n_cache.put(5, 5); n_cache.print(); n_cache.put(4, 4); n_cache.print(); n_cache.put(2, 2); n_cache.print(); return 0; }
- 运行结果如下:
- 其它的缓存算法(页面置换算法)--FIFO/LFU
LRU算法--作为缓存
猜你喜欢
转载自blog.csdn.net/YRC333/article/details/99086568
今日推荐
周排行